2011-09-16 35 views
5

Tôi đang sử dụng hàm mktime (struct tm *) trong Suse 10.Hành vi khó hiểu của mktime trên Linux?

Bây giờ, tôi nhận thấy một số hành vi lạ khi thời gian tiết kiệm ánh sáng ban ngày được bật. Giả sử tôi đã bật thời gian tiết kiệm ánh sáng ban ngày để bắt đầu vào ngày 15 tháng 9 lúc 18:10 và hiệu chỉnh ánh sáng ban ngày trong 30 phút. Bây giờ, khi tôi gọi mktime với cấu trúc tm có ngày là 15 tháng 9 18:10 và tm_isdst được đặt thành 0, sau đó tôi lấy lại cùng giá trị trong cấu trúc tm chỉ với tm_isdst được đặt thành 1.

Nhưng, nếu vượt qua ngày là 15 tháng 9 18:10 với tm_isdst đặt thành 1, thì tôi thấy thời gian đã thay đổi thành 17:40. Sự điều chỉnh trong cấu trúc tm này được chú ý trong khoảng thời gian từ ngày 15 tháng 9 năm 18:10 đến ngày 15 tháng 9, 18:40, nhưng sau đó không có sự điều chỉnh nào xảy ra và cờ dst vẫn được kích hoạt. Ngay cả khi tôi vượt qua ngày 16 tháng 9 năm 18:10, không có chỉnh sửa thời gian xảy ra chỉ cờ dst vẫn được kích hoạt.

Tôi hoàn toàn bối rối. Đây có phải là hành vi đúng đắn của mktime không?

Trả lời

6

Nếu những thay đổi theo giờ địa phương 30 phút cho DST, sau đó mỗi năm một lần có 30 phút giờ địa phương điều đó xảy ra hai lần (một lần với DST, và một khi không có) và thêm 30 phút mà không bao giờ xảy ra (nó bị bỏ qua khi thời gian thay đổi).

Vì vậy, giờ địa phương trong vòng 30 phút khi đồng hồ được đặt trở lại không rõ ràng, trừ khi DST có hiệu lực được chỉ định hay không; có hai khoảnh khắc thực tế trong thời gian mà chúng có thể tương ứng.

Giờ địa phương trong vòng 30 phút khi đồng hồ được đặt trước không hợp lệ; không có bất kỳ khoảnh khắc thực sự nào trong thời gian chúng có thể tương ứng với (mặc dù việc chuyển đổi có thể vẫn được thực hiện bằng cách giả sử rằng DST có hiệu lực, hoặc không có hiệu lực). Vì vậy, đối với một số giờ địa phương (bỏ qua trạng thái DST) có thể có nhiều hơn một thời gian UTC tương ứng, nhưng đối với bất kỳ thời gian UTC nào chỉ có một thời gian cục bộ (nếu điều chỉnh DST được tính đúng).

Khi bạn gọi mktime, chuyển đổi giờ địa phương bạn đưa nó thành time_t như DST có hiệu lực hay không, tùy thuộc vào giá trị tm_isdst. Các giá trị được chỉnh sửa mà bạn lấy lại dựa trên đảo ngược chuyển đổi này và hệ thống sẽ xác định xem bạn có nhận được thời gian DST hay thời gian không DST hay không, tùy thuộc vào ý tưởng của nó về việc liệu DST có hiệu lực vào thời điểm chuyển đổi hay không. Thời gian bạn đã cho nó và thời gian bạn quay trở lại thực sự đại diện cho cùng một thời điểm trong thời gian, nhưng với các khoảng cách khác nhau từ UTC do các trạng thái DST khác nhau.

Vì vậy, có, đây là hành vi đúng của mktime. Nó được cho là bình thường hóa các giá trị trong cấu trúc, theo ý tưởng của nó về cách thể hiện đúng thời gian bạn đã cho nó. Điều này cũng minh họa tại sao ta nên cẩn thận về việc sử dụng thời gian cục bộ theo dõi các sự kiện thực tế - nếu trạng thái DST hoặc offset từ UTC không được lưu cùng với thời gian, một số giá trị thời gian cục bộ có thể không rõ ràng.

+0

Tôi không biết.Có lẽ nó không xác định để vượt qua thời gian 18:10 (dst 0) để mktime, nhưng tôi nghĩ rằng điều hữu ích nhất để trở lại trong trường hợp đó sẽ là 18:40 (dst 1) –

0

Khám phá this answer và xem điều đó có hữu ích không. Ngoài ra, múi giờ hệ thống sẽ bù đắp như thế nào? Kiểm tra bằng cách chạy:

date +%z 
+1

Cảm ơn bạn đã trả lời. Khoảng thời gian bù trừ múi giờ hệ thống trả về +0830. Nhưng, câu hỏi của tôi là tại sao việc chỉnh sửa thời gian chỉ xảy ra vào thời điểm DST được kích hoạt. Ví dụ: DST được đặt để được kích hoạt vào ngày 15 tháng 9 18:10, do đó, sự cố xảy ra từ thời gian đó trong nửa giờ. Nhưng, vào ngày 16 tháng 9 18:10, vấn đề không xảy ra. Tại sao? – Jay

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