Tại sao 2 lệnh ngày này cho kết quả khác nhau?


9
$ date -d "Apr 1 2016 - 1 month" +%B

cho tôi "Tháng ba", thật tuyệt - tháng đến trước tháng tư là tháng ba. Nếu tôi làm điều này tuy nhiên:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

nó cho tôi "tháng hai". Điều này gây ra một lỗi trong một số mã phức tạp hơn mà tôi có. Tại sao 2 lệnh này hiển thị kết quả khác nhau?


Cả hai đã cho tôiMarch
cuonglm

1
Theo giải thích của Thomas, điều này phụ thuộc vào múi giờ của bạn. DST của tôi thay đổi vào ngày 13 tháng 3 - có thể bạn không thay đổi, vì vậy bạn có thể không thấy hành vi này vào cùng ngày hoặc có thể nếu bạn không có thay đổi DST.
Tal

Câu trả lời:


11

Bạn có thể thấy vấn đề bằng cách bật dấu vết vỏ:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

Khi bạn sử dụng đầu ra của datelệnh bên trong , đó là vào đầu tháng Tư và khi trừ đi một tháng sẽ xảy ra sự gián đoạn do thay đổi EST / EDT:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

Tất nhiên, kết quả của bạn sẽ thay đổi tùy theo cài đặt múi giờ địa phương của bạn. Bật theo dõi sẽ hiển thị múi giờ (trong trường hợp của tôi, EDT).

Lý do tại sao các kết quả khác nhau là trong trường hợp sau, bạn đã cung cấp thêm thông tin date, làm cho tham số của nó cụ thể hơn , tức là thời gian cụ thể trong ngày. Trong phần đầu tiên, điều đó không được chỉ định, đưa ra datenhiều thời gian hơn về cách xác định ngày / giờ để hiển thị.


Bây giờ tôi nhận ra rằng điều này có liên quan đến thời gian tiết kiệm ánh sáng ban ngày (của tôi ở đây: timeanddate.com/time/zone/canada/ed hôm nay ), nhưng tôi vẫn không theo dõi lý do tại sao lệnh ngày dường như diễn giải cùng một ngày khác nhau trong một subshell hơn trong vỏ chính. Nếu tôi chạy một tập lệnh với : date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")", tôi nhận được chính xác cùng một kết quả, bao gồm cùng một thẻ múi giờ - tại sao lại xóa một tháng khỏi cả hai cho kết quả khác nhau?
Tal

Oh - chỉnh sửa cuối cùng của bạn làm cho nó rõ ràng. Cảm ơn
Tal
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.