เหตุใดคำสั่ง 2 วันเหล่านี้จึงให้ผลลัพธ์ที่แตกต่างกัน


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

ให้ "เดือนมีนาคม" แก่ฉันซึ่งยอดเยี่ยม - เดือนที่มาก่อนเมษายนคือเดือนมีนาคม ถ้าฉันทำสิ่งนี้อย่างไรก็ตาม:

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

มันทำให้ฉัน "กุมภาพันธ์" นี่เป็นสาเหตุของข้อผิดพลาดในโค้ดที่ซับซ้อนกว่าที่ฉันมี เหตุใดคำสั่ง 2 เหล่านี้จึงแสดงผลลัพธ์ที่ต่างกัน


ทั้งสองให้ฉันMarch
cuonglm

1
ตามที่อธิบายโดย Thomas สิ่งนี้ขึ้นอยู่กับเขตเวลาของคุณ การเปลี่ยนแปลงเวลาของฉันในวันที่ 13 มีนาคม - คุณอาจจะไม่ดังนั้นคุณอาจไม่เห็นพฤติกรรมนี้ในวันที่เดียวกันหรืออาจเป็นได้ถ้าคุณไม่มีการเปลี่ยนแปลงเวลา
Tal

คำตอบ:


11

คุณสามารถเห็นปัญหาโดยการเปิดเปลือกติดตาม:

+ 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

เมื่อคุณใช้เอาต์พุตของdateคำสั่งด้านในคำสั่งนั้นจะอยู่ที่จุดเริ่มต้นของเดือนเมษายนและเมื่อการลบเดือนทำงานเข้าสู่ความไม่ต่อเนื่องเนื่องจากการเปลี่ยนแปลง EST / EDT:

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

แน่นอนผลลัพธ์ของคุณจะแตกต่างกันไปตามการตั้งค่าเขตเวลาท้องถิ่นของคุณ การเปิดการติดตามจะแสดงเขตเวลา (ในกรณีของฉันEDT)

เหตุผลที่ผลลัพธ์แตกต่างกันคือในกรณีหลังคุณให้ข้อมูลเพิ่มเติมdateทำให้พารามิเตอร์เฉพาะเจาะจงมากขึ้นนั่นคือเวลาเฉพาะของวัน ในส่วนแรกที่ไม่ได้ระบุdateเพิ่มระยะเวลาเพิ่มเติมเกี่ยวกับวิธีการกำหนดวันที่ / เวลาที่จะแสดง


ตอนนี้ฉันรู้แล้วว่าสิ่งนี้เกี่ยวข้องกับการปรับเวลาตามฤดูกาล (ของฉันอยู่ที่นี่: timeanddate.com/time/zone/canada/edmonton ) แต่ฉันยังไม่ได้ติดตามว่าทำไมคำสั่ง date ดูเหมือนจะตีความวันที่แตกต่างกัน ในเชลล์ย่อยมากกว่าในเชลล์หลัก หากฉันเรียกใช้สคริปต์ด้วย: date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"ฉันจะได้รับผลลัพธ์เดียวกันทั้งหมดรวมถึงแท็กเขตเวลาเดียวกัน - ทำไมการลบหนึ่งเดือนจากทั้งสองจึงให้ผลลัพธ์ที่แตกต่างกัน
Tal

โอ้ - การแก้ไขครั้งล่าสุดของคุณทำให้ชัดเจน ขอบคุณ
Tal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.