2010-10-04 36 views

Trả lời

14

Có hai phần cho câu hỏi này:

  1. Nhận UTC bù đắp như một Format boost::posix_time::time_duration
  2. các time_duration theo quy định

Rõ ràng, nhận múi giờ địa phương là không được hiển thị rất tốt trong một API được triển khai rộng rãi. Chúng ta có thể, tuy nhiên, có được nó bằng cách lấy sự khác biệt của một khoảnh khắc tương đối so với UTC và cùng một thời điểm tương ứng với múi giờ hiện tại, như thế này:

boost::posix_time::time_duration get_utc_offset() { 
    using namespace boost::posix_time; 

    // boost::date_time::c_local_adjustor uses the C-API to adjust a 
    // moment given in utc to the same moment in the local time zone. 
    typedef boost::date_time::c_local_adjustor<ptime> local_adj; 

    const ptime utc_now = second_clock::universal_time(); 
    const ptime now = local_adj::utc_to_local(utc_now); 

    return now - utc_now; 
} 

định dạng bù đắp theo quy định là chỉ là vấn đề của imbuing quyền time_facet:

std::string get_utc_offset_string() { 
    std::stringstream out; 

    using namespace boost::posix_time; 
    time_facet* tf = new time_facet(); 
    tf->time_duration_format("%+%H:%M"); 
    out.imbue(std::locale(out.getloc(), tf)); 

    out << get_utc_offset(); 

    return out.str(); 
} 

Bây giờ, get_utc_offset_string() sẽ mang lại kết quả mong muốn.

+0

Đó là vấn đề phức tạp; một giá trị UTC cụ thể có thể tương ứng với nhiều múi giờ, chẳng hạn. –

+0

@Roger: Vì vậy ... Tôi đoán cách chính xác để nói rằng đó là tôi đang tìm bù đắp UTC cho thời gian hiện tại, không phải là múi giờ? –

+1

Có, nếu đó là những gì bạn quan tâm (đó cũng là những gì nó âm thanh như tôi), câu trả lời này là tại chỗ trên. Tôi đã trả lời nhiều hơn để "nhận được múi giờ địa phương không được hiển thị rất tốt trong một API được triển khai rộng rãi". Chỉ cần lưu ý rằng số dư UTC bạn nhận được cho ngày hôm nay có thể khác sau (hoặc sớm hơn). –

1

Kể từ C++ 11 bạn có thể sử dụng chrono và std::put_time:

#include <chrono> 
#include <iomanip> 
#include <iostream> 
int main() 
{ 

    using sc = std::chrono::system_clock; 
    auto tm = sc::to_time_t(sc::now()); 

    std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n"); 

    std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n"); 

} 

này tạo ra kết quả như sau:

thời gian định dạng: 2018-02-15T10: 25: 27 + 0100

chỉ bù đắp: +0100

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