2009-10-14 8 views
6

Tôi phát hiện ra một kết quả lạ trong thư viện thời gian ngày của Boost C++. Có sự không thống nhất giữa microsec_clocksecond_clock và tôi không hiểu tại sao lại như vậy. Tôi đang sử dụng Windows XP 32-bitBoost C++ date_time microsec_clock và second_clock

snip My mã:

using namespace boost::posix_time; 
... 
ptime now = second_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
ptime now_2 = microsec_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
... 

bản in ra tôi mong đợi là thời gian hiện tại mà không miliseconds và với milliseonds. Tuy nhiên, những gì tôi có trong máy tính của tôi là:

 
2009-10-14T16:07:38 
1970-06-24T20:36:09.375890 

Tôi không hiểu tại sao có ngày hết hạn (năm 1970 ???) trong thời gian microsec_clock của tôi. Tài liệu liên quan cho Boost: link to boost date time

Trả lời

5

Không chắc chắn điều gì có thể sai cho bạn; chính xác cùng một mã hoạt động cho tôi.

 
$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
using namespace boost::posix_time; 
int main() { 
    ptime now = second_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
    ptime now_2 = microsec_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
    return 0; 
} 
^D 
$ c++ -lboost_date_time test.cc 
$ ./a.out 
Current Time is: 2009-10-14T16:26:55 
Current Time is: 2009-10-14T16:26:55.586295 

thi-khôn ngoan, second_clock sử dụng timemicrosec_clock sử dụng gettimeofday hoặc GetSystemTimeAsFileTime bên dưới, tùy thuộc vào nền tảng này. Đã xảy ra sự cố với nền tảng của bạn - hệ điều hành và phiên bản của bạn là gì?


Phiên bản Boost của bạn là gì? Nếu giá trị này là 1.38 hoặc thấp hơn, hãy nâng cấp lên 1.39 hoặc áp dụng sửa chữa theo cách thủ công #2809.

 
--- boost/date_time/filetime_functions.hpp (revision 53621) 
+++ boost/date_time/filetime_functions.hpp (revision 53622) 
@@ -96,9 +96,7 @@ 
    { 
     /* shift is difference between 1970-Jan-01 & 1601-Jan-01 
     * in 100-nanosecond intervals */ 
-  const uint64_t c1 = 27111902UL; 
-  const uint64_t c2 = 3577643008UL; // issues warning without 'UL' 
-  const uint64_t shift = (c1 << 32) + c2; 
+  const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 

     union { 
      FileTimeT as_file_time; 

Windows FileTime có chênh lệch khác so với thời gian UNIX và mã ở chế độ Boost trước sẽ không tạo chênh lệch chênh lệch chính xác trong các trình biên dịch tối ưu nhất định.

+0

Tôi đang sử dụng hệ thống Win32, Windows XP SP2 32 bit chính xác. – Lily

+0

Tôi đang sử dụng 1.39 đã có với Eclipse 3.4.1 và MingW 3.4. Ngoài ra, tôi đang gặp cảnh báo: Mô tả \t Resource \t Đường dẫn \t Location \t Loại C: /boost/boost_1_39/boost/date_time/filetime_functions.hpp trái đếm sự thay đổi> = chiều rộng của loại \t CommercialDetection dòng 101 \t C/C++ Vấn đề như tốt – Lily

+0

Hmm, tôi nghĩ rằng sửa chữa này là trong 1,39 nhưng tôi có thể kiểm tra lại. – ephemient

1

Ngày 1970 nhiều khả năng xuất phát từ cách unix time được thể hiện, tính bằng giây từ ngày 1 tháng 1 năm 1970. Tôi đoán có thể bằng cách nào đó nhận thời gian hoạt động của hệ thống tính bằng mili giây và diễn giải nó trong vài giây 1/1/1970. Một thời gian hoạt động của một ít hơn 4 giờ sẽ đến với ngày này.

1

Không giống như second_clock, tài liệu đề cập đến microsec_clock::universal_time: Trả về thời gian tính theo giờ UTC dựa trên thiết lập máy tính.
Bạn nên kiểm tra cài đặt đồng hồ phần cứng của mình (hoặc nơi nào mà microsec nhận được giá trị của nó từ).

chỉnh sửa:
Nếu nó không liên quan đến cài đặt máy tính của bạn, nó sẽ phải là hành vi sai trái, điều mà tôi rất nghi ngờ.

+0

Điểm rất tốt và tôi cũng tìm thấy điều này: Nhận thời gian UTC bằng đồng hồ phân giải phụ thứ hai. Trên các hệ thống Unix, điều này được thực hiện bằng cách sử dụng GetTimeOfDay. Trên hầu hết các nền tảng Win32 nó được thực hiện bằng cách sử dụng ftime. Các hệ thống Win32 thường không đạt được độ phân giải micro giây thông qua API này. Nếu độ phân giải cao hơn rất quan trọng đối với ứng dụng của bạn, hãy kiểm tra nền tảng của bạn để xem độ phân giải đạt được. ===> Tôi đang sử dụng hệ thống Win32, vì vậy có thể không có độ phân giải như vậy ở tất cả trong máy của tôi. Đó có thể là lý do. Tuy nhiên, bản in đã cho tôi một ngày, sau đó những con số này đến từ đâu? ... – Lily

+0

Thực hiện khôn ngoan nó tạo ra một time_type từ ngày hiện tại và ftime() trong create_time() nếu tôi thấy quyền đó. –

+0

Và nếu ftime() không hỗ trợ độ phân giải phụ thứ hai, tôi mong đợi sẽ mất độ phân giải cao và dự phòng cho độ phân giải cao nhất tiếp theo. –