Tại sao có sự khác biệt với ngày Unix trong khoảng từ 2 đến 3 tháng


16

Làm thế nào là điều này có thể và làm thế nào để tôi đối phó với nó? Tôi đang tạo tập lệnh sao lưu phụ thuộc vào Unix datevà đã phát hiện ra một lỗi thú vị:

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014

Nó có thể là một năm nhuận / lỗi ngày 29 tháng 2? Không có khả năng trong một công cụ như datemặc dù ...
Mark Henderson

Câu trả lời:


44

Bạn đang thấy hành vi này vì thời gian mùa hè (thời gian tiết kiệm ánh sáng ban ngày).

Bởi vì bạn hiện đang trong thời gian mùa hè, nơi đồng hồ của bạn đi trước một giờ, khi bạn hỏi ba tháng trước vào lúc nửa đêm ngày đầu tiên của tháng sáu, thời gian kết thúc là một giờ "sớm hơn" vì không phải là ba giờ mùa hè vài tháng trước

Tài liệu ngày GNU đề nghị giải quyết vấn đề này bằng cách sử dụng 12:00 trưa và ngày 15 của tháng làm điểm bắt đầu, khi yêu cầu tương ứng ngày hoặc tháng. Ví dụ:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"

cảm ơn bạn. Có, chính xác là "3 tháng trước" vào lúc 01 giờ sáng:[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
Shirker

Đừng! Tôi nghĩ rằng tôi cần phải xem qua một số kịch bản của mình vì tôi nghi ngờ tôi đã bỏ qua đề xuất này về datecách sử dụng.
Caleb

14

Nếu thời gian tuyệt đối là mối quan tâm chính của bạn, có lẽ tốt nhất là bạn nên sử dụng UTC vì nó tồn tại cho mục đích đó. Câu trả lời của Michael rất hữu ích khi bạn phải giải quyết vấn đề, nhưng thường thì nên tránh hoàn toàn ở nơi bạn có thể.

Khi hệ thống của bạn không được đặt thành UTC theo mặc định, cách đơn giản nhất để vượt qua múi giờ là bằng cách thêm tiền tố vào lệnh của bạn với TZbiến môi trường. Điều này giới hạn chuyển đổi vùng thành một lệnh duy nhất và giữ cho biến không bị rò rỉ vào các lệnh tiếp theo của bạn.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

Những gì bạn không nên làm là xuất TZbiến vì điều này có thể khiến mọi thứ rất khó hiểu để khắc phục sự cố, như minh họa sau đây.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014

-3

Vào năm cụ thể mà máy tính của bạn nghĩ rằng nó đang được vận hành và vào ngày cụ thể bạn đã chọn để kiểm tra "1 tháng trước, 2 tháng trước và 3 tháng trước, vâng - đó có thể là một phát hiện ngày 29 tháng 2. Không phải lúc nào một lỗi, nhưng ..

Bây giờ, hôm nay KHÔNG PHẢI 2014-06-01. Thử lại. Đặt ngày máy tính thành 2013-06-01. Thử lại.
Đặt ngày máy tính thành 2014-09-01. Thử lại.


6
Nếu bạn đang cung cấp ngày ở MDYđịnh dạng của Mỹ , hãy sử dụng /es để phân tách. Thậm chí tốt hơn, vì chúng tôi là một cộng đồng quốc tế ở đây, sử dụng các ngày ISO thích hợp như 2014-09-01.
glglgl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.