2012-05-10 28 views
7

Tôi có nghi ngờ về việc sử dụng cờ tm_isdst trong cấu trúc tm. Theo trang người đàn ông và googled kết quả, tôi hiểu rằng giá trị của nó được giải thích như saucờ mktime và tm_isdst

A. Giá trị 0 chỉ ra DST không có hiệu lực cho lần đại diện

B. Giá trị 1 cho DST là có hiệu lực

C. Giá trị -1 gây ra mktime để kiểm tra xem liệu DST có hiệu lực hay không.

Đây là điểm thứ ba gây nhầm lẫn cho tôi. Nghi ngờ của tôi là làm thế nào mktime có thể tìm ra cho dù DST đã được áp dụng hay không chính xác.

Ví dụ

My Time Zone = GMT + 3:00 
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple) 
Current UTC time = "01/Jan/2012 00:00:00" 
UTC time in seconds time_t timetUTC = X seconds 
Hence my time is = "01/Jan/2012 03:00:00" 

Như thời gian trôi qua, những thay đổi giá trị thời gian của tôi như sau

"01/Jan/2012 04:00:00"   (X + 1 * 60 * 60) 
"01/Jan/2012 05:00:00"   (X + 2 * 60 * 60) 
"01/Jan/2012 05:59:59"   (X + 2 * 60 * 60 + 59) 
"01/Jan/2012 05:00:00"   (X + 3 * 60 * 60) 
"01/Jan/2012 06:00:00"   (X + 4 * 60 * 60) 

Theo hiểu biết của tôi

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0 
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1 

Bằng cách này, mặc dù tất cả các thành phần khác của cấu trúc tm bằng nhau trong cả hai trường hợp, mktime (tmMyTime) có thể trả về p giá trị UTC roper, tùy thuộc vào giá trị tm_isdst.

Bây giờ, nếu tôi đặt tmMyTime.tm_isdst = -1, giá trị nào sẽ trở lại? Tôi đọc về biến TZ, cơ sở dữ liệu thời gian vv .. Bất chấp tất cả điều đó, về mặt logic như thế nào mktime() tìm ra liệu có áp dụng hiệu chỉnh DST hay không cho các giá trị tm có thể xảy ra hai lần?

Chúng tôi không có DST trong múi giờ của chúng tôi. Do đó tôi không chắc chắn liệu sự hiểu biết của tôi là chính xác hay không. Hãy sửa tôi nếu tôi sai. Sự giúp đỡ của bạn được đánh giá rất cao.

+4

Bạn đã khám phá ra rằng giờ địa phương không rõ ràng. Nó là. –

Trả lời

4

Tóm lại: nó phụ thuộc vào việc triển khai thực hiện.

mktime biết quy tắc DST bằng cách kiểm tra ngôn ngữ.

Đối với phần lớn hơn của năm, mktime có thể tìm hiểu xem DST có được áp dụng cho một giờ địa phương cụ thể không. Vấn đề thực sự là "trùng lặp" giờ khi DST chuyển ngược (trong ví dụ của bạn 05:00:00 - 05:59:59). Đối với phạm vi thời gian cục bộ này, với tm_isdst = -1, mktime không thể biết liệu DST có hiệu lực hay không. Lựa chọn nào trong số này được chọn, khác với triển khai thực hiện với một triển khai khác. Với phiên bản GNU của mktime, UTC trước khi ca được trả về.

+1

Cảm ơn Pat. Tại mktime tốt nhất có thể làm chỉ có nhiều là những gì tôi cũng cảm thấy. Nhưng không nơi nào (bao gồm cả trang người đàn ông) có một mô tả rõ ràng về việc xử lý 1 giờ không rõ ràng này. Tôi trở nên bối rối hơn khi chú ý đến việc đặt lại cố ý cờ này thành -1 trong cơ sở mã của chúng tôi mỗi lần sau "tm = localtime_r (time_t)". Ít nhất trong trường hợp này, tôi nghĩ lá cờ nên bị bỏ hoang. Ngoài ra, tôi cảm thấy rằng việc triển khai phải nêu rõ hành vi này trong trang người đàn ông. Hoặc là một chức năng tiêu chuẩn nên cung cấp cho luôn luôn kết quả chính xác hoặc ném lỗi về thất bại hoặc ít nhất là đề cập đến độ lệch trong trang người đàn ông. – mpathi

+0

Câu trả lời hay. Vấn đề ở đây là nếu tất cả người dùng truyền cho chúng ta là một cái gì đó giống như một 'struct tm', và giao diện duy nhất của chúng ta tới thông tin múi giờ là Posix' mktime() ', thì chúng ta không thể mã hóa xung quanh vấn đề. Hoặc chúng tôi có thể buộc người dùng chỉ định "ngày 3 tháng 11 năm 2013 lúc 1:30:00 sáng" mà họ đang cung cấp cho chúng tôi hoặc chúng tôi cũng có thể đặt 'tm_isdst = -1' và hy vọng điều tốt nhất. –

1

Tôi nghĩ rằng nó sẽ phụ thuộc phần nào vào nền tảng của bạn. Trong Windows, ít nhất, tài liệu mktime() nói "Thư viện thời gian chạy C giả định các quy tắc của Hoa Kỳ để thực hiện tính toán Thời gian tiết kiệm ánh sáng ban ngày", do đó, nó có một bảng quy tắc ở đâu đó để xác định khi nào DST bắt đầu/kết thúc vào bất kỳ năm nào.

Bạn may mắn không có DST ở đâu. Trong thế giới của tôi, đó là việc thu thập và trình bày dữ liệu theo thời gian thực, DST là một mối phiền toái lớn!

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, vẫn chưa rõ làm thế nào mktime() có thể làm điều đó. Vì hai giá trị time_t UTC có thể có cùng giá trị tm trong múi giờ địa phương (ngoại trừ is_dst) và nếu tôi đặt lại cờ này thành -1, hàm mktime() logic không có bất kỳ đầu mối nào so với giá trị UTC mà nó nên chuyển nó trở lại. – mpathi

1

tm_isdst không thể giải quyết chung thời gian mơ hồ. Đó là bởi vì nhiều múi giờ có chuyển tiếp (một lần) mà không cần nhảy từ dst đến nodst, chỉ thay đổi độ lệch và ký hiệu vùng. Vì vậy, cả hai lần (trước và sau khi chuyển đổi) có cùng một tm_isdst. Một số khu vực khác thay đổi tm_isdst khi chuyển đổi giờ mùa hè/mùa đông nhưng không thay đổi chữ viết tắt (ví dụ: Úc/Melbourne).