2012-01-05 34 views
9

Những vấn đề là:tăng: lấy LOCAL_DATE_TIME hiện tại với múi giờ hiện tại từ máy

  • tôi biết làm thế nào để có được thời gian địa phương trong thúc đẩy

mã:

boost::local_time::local_date_time currentTime(
     boost::posix_time::second_clock::local_time(), 
     boost::local_time::time_zone_ptr()); 
    std::cout << currentTime.local_time() << std::endl; 
  • Tôi biết cách lấy dữ liệu múi giờ hiện tại từ máy (Tôi hy vọng đó là một cách phù hợp)

mã:

tzset(); 
// the var tzname will have time zone names 
// the var timezone will have the current offset 
// the var daylight should show me if there is daylight "on" 

nhưng tôi vẫn không thể có được LOCAL_DATE_TIME với TIME_ZONE hiện tại ... Không ai biết, làm thế nào để làm điều đó?

+0

Bạn có * phải * để in thời gian trong localtime? Nếu bạn có thể sử dụng UTC bạn sẽ tiết kiệm cho mình tất cả các loại nhức đầu. –

+0

Hãy xem [Hướng dẫn IO ngày giờ] (http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/date_time_io.html#date_time.io_tutorial)? –

+0

"Bạn có phải in giờ địa phương không?" Có, tôi phải: ( – Alek86

Trả lời

2

OK, như bây giờ tôi vẫn không biết toàn bộ câu trả lời

nhưng có mã, có thể giúp để in các múi giờ hiện tại bù đắp

(dựa trên một câu trả lời cho một câu hỏi liên quan đây (stackoverflow) và một số mã tăng bên trong)

tôi hoàn toàn không chắc chắn nó sẽ làm việc một cách chính xác trên tất cả các máy, nhưng bây giờ nó có còn hơn không:

boost::posix_time::time_duration getUtcOffset(const boost::posix_time::ptime& utcTime) 
{ 
    using boost::posix_time::ptime; 
    const ptime localTime = boost::date_time::c_local_adjustor<ptime>::utc_to_local(utcTime); 
    return localTime - utcTime; 
} 

std::wstring getUtcOffsetString(const boost::posix_time::ptime& utcTime) 
{ 
    const boost::posix_time::time_duration td = getUtcOffset(utcTime); 
    const wchar_t fillChar = L'0'; 
    const wchar_t timeSeparator = L':'; 

    std::wostringstream out; 
    out << (td.is_negative() ? L'-' : L'+'); 
    out << std::setw(2) << std::setfill(fillChar) 
     << boost::date_time::absolute_value(td.hours()); 
    out << L':'; 
    out << std::setw(2) << std::setfill(fillChar) 
     << boost::date_time::absolute_value(td.minutes()); 
    return out.str(); 
} 
int main() 
{ 
    const boost::posix_time::ptime utcNow = 
     boost::posix_time::second_clock::universal_time(); 

    const std::wstring curTimeOffset = getUtcOffsetString(utcNow); 
    std::wcout << curTimeOffset.c_str() << std::endl; // prints -05:00 on my comp 
} 
+0

Bỏ qua DST có nghĩa là số học lịch (ví dụ, trừ một date_duration) sẽ không hoạt động chính xác trên đối tượng local_date_time trả về –

1

Vì bạn nói rằng bạn có thông tin múi giờ, câu hỏi duy nhất là làm thế nào để sử dụng tăng cường cho chuỗi định dạng mà bạn cần. Bên dưới là mã mẫu:

using namespace boost::local_time; 
    using namespace boost::posix_time; 

    // Composing this string is the most tricky part. Syntax see in: 
    // boost\date_time\local_time\posix_time_zone.hpp 
    string posix_tz_def("PST-5PDT01:00:00,M4.1.0/02:00:00,M10.1.0/02:00:00"); 
    local_date_time ldt(second_clock::local_time(), 
         time_zone_ptr(new posix_time_zone(posix_tz_def))); 

    std::stringstream ss; 
    local_time_facet* output_facet = new local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    output_facet->format("%Y-%m-%dT%H:%M:%S %Q"); 
    ss << ldt; 

    string formatted_datetime = ss.str(); // 2012-01-05T18:14:06 -05:00 

Trong phương pháp này, phần có vấn đề nhất là chuỗi múi giờ posix. Tôi nghĩ rằng nên có cơ sở dữ liệu với các chuỗi cho mỗi múi giờ và tăng cung cấp một mẫu để làm việc với tập tin .csv. Nếu điều duy nhất bạn cần được bù đắp trong chuỗi chỉ cần thiết lập DTS đến 0:00:00 và không quan tâm đến phần còn lại. Ví dụ: sử dụng chuỗi này: PST-5:30PDT0,0,365 (mãi mãi PDT, shift 0). Thay thế "-5: 00" với số tiền bạn cần.

Mặc dù, cách C++/tăng cường sẽ triển khai nhà cung cấp múi giờ riêng bằng cách lấy từ date_time::time_zone_base.

Có thể tìm thấy nhiều mẫu và ý tưởng khác here.

+0

Không trả lời câu hỏi. bout định dạng một chuỗi, nhưng về việc xây dựng một đối tượng local_date_time. –

0

Vì vậy, nếu bạn cũng cần phải được tính theo giờ UTC đúng bù đắp hơn ví dụ trước đây của tôi nên được sửa đổi một chút để tạo ra chuỗi múi giờ chính xác:

static boost::posix_time::time_duration utc_offset(
    second_clock::local_time() - second_clock::universal_time()); 
std::ostringstream ss_posix_tz_def; 
// We don't care about real zone name so, just put any three letters. 
ss_posix_tz_def << "LOC" << utc_offset; 
string posix_tz_def = ss_posix_tz_def.str(); 

Một giải pháp khác được viết toàn bộ một nhà cung cấp múi giờ mới. Như thế này đơn giản:

// We assume local TZ doesn't have DST, UTC offset is calculated basing on 
// local system clocks. Thus, using of this provider for time calculations for 
// an arbitrary date is not a good idea. 
class machine_time_zone : public boost::local_time::custom_time_zone { 
public: 
    typedef boost::local_time::custom_time_zone base_type; 
    typedef base_type::time_duration_type time_duration_type; 

    machine_time_zone() 
    : boost::local_time::custom_time_zone(
     time_zone_names("Local machine TZ", "LOC", "", ""), 
     GetUTCOffset(), 
     boost::local_time::dst_adjustment_offsets(
      time_duration_type(0, 0, 0), 
      time_duration_type(0, 0, 0), time_duration_type(0, 0, 0)), 
     boost::shared_ptr<boost::local_time::dst_calc_rule>()) { 
    } 

    // This method is not precise, real offset may be several seconds more or less. 
    static const boost::posix_time::time_duration& GetUTCOffset() { 
    using boost::posix_time::second_clock; 
    static boost::posix_time::time_duration utc_offset(
     second_clock::local_time() - second_clock::universal_time()); 
    return utc_offset; 
    } 
}; 

Chỉ cần vượt qua nó khi xây dựng local_date_time:

local_date_time ldt(second_clock::local_time(), 
        time_zone_ptr(new machine_time_zone())); 
+0

Bỏ qua DST có nghĩa là số học lịch (ví dụ, trừ một date_duration) sẽ không hoạt động chính xác trên đối tượng local_date_time trả về. –

Các vấn đề liên quan