คำนวณจำนวนวันตั้งแต่ 1/1/1970


10

คุณสามารถคำนวณจำนวนวันตั้งแต่ 1/1/1970 ได้อย่างไร นี่สำหรับการอัพเดตแอ็ตทริบิวต์shadowLastChangeบน OpenLDAP

มีวิธีทำเช่นนี้โดยใช้คำสั่งlinux dateหรือไม่?


ในทุบตีและทันสมัยที่สุดเปลือกหอยบอร์นที่ได้มาจาก$()เป็นที่ต้องการมากกว่า backticks สำหรับการอ่านและเหตุผลอื่นecho $(( $(date ...) / 86400 ))
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ยังไม่มี 2,000 ... ใครสามารถแก้ไขและแก้ไขชื่อ :-)
แหวนØ

คำตอบ:


20

ring0 เอาชนะฉันภายในไม่กี่วินาที แต่คำสั่งเต็มคือ:

echo $(($(date --utc --date "$1" +%s)/86400))

สิ่งนี้ไปตามเวลา UTC ผลลัพธ์:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

การตรวจสอบอย่างรวดเร็วด้วย WolframAlphaแสดงให้เห็นว่านี่เป็นค่าที่ถูกต้อง


1
เผ่นวินาที :)
netvope

1
@netvope หลังจากวินาทีกระโดดเพิ่มขึ้นเวลา unix จะถูกรีเซ็ตอีกครั้ง ดังนั้นในแต่ละวันจะมีความแม่นยำเพิ่มขึ้น 86400 วินาที อย่างไรก็ตามเวลา unix 915148800 อาจใช้ได้สำหรับทั้ง UTC 1998-12-31T23: 59: 60 และ 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

คำสั่งสามารถให้คุณจำนวนวินาทีตั้งแต่date1970-01-01 00:00:00 UTC

  date +"%s"

คุณสามารถหารผลลัพธ์ด้วย3600*24การรับจำนวนวัน (UTC)

เช่นใน Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

เพื่อแสดงจำนวนวัน


9

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด:

expr $(date +%s) / 86400

ทำไม downvote นี้ มันเป็นคำตอบที่ดีที่สุดและสั้นที่สุดและง่ายที่สุด
Tom Corelis

1

ฉันต้องการแก้ปัญหานี้เช่นกัน แต่ฉันต้องการได้รับคุณค่าที่เหมือนกันสำหรับวันที่ # โดยไม่คำนึงถึงเวลาของวัน ด้วยวิธีการเช่นที่แสดงที่นี่ค่าจะเปลี่ยนในเวลาเที่ยงคืน UTC แทนเวลาท้องถิ่นเที่ยงคืน สิ่งนี้อาจดูเหมือนว่ามีปัญหาน้อยลงในสหภาพยุโรปหรือชายฝั่งตะวันออกของสหรัฐอเมริกาซึ่งใกล้เคียงกับ UTC ซึ่งค่าวันจะไม่เปลี่ยนแปลงในช่วงกลางของวันทำงานทั่วไป แต่ในเช่นแคลิฟอร์เนียการเปลี่ยนแปลงวัน จะเกิดขึ้นเวลา 16.00 น. PST ซึ่งอาจไม่สะดวก ฉันคิดว่าชาวออสเตรเลียจะรู้สึกรำคาญโดยเฉพาะอย่างยิ่งที่จะต้องเปลี่ยนค่าของวันในตอนเช้า

หากเราต้องการแก้ไขให้ถูกต้องเราต้องเพิ่มออฟเซ็ตจาก UTC ก่อนหารด้วยวินาที / วัน โชคดีที่คำสั่งวันที่ Linux มีลำดับรูปแบบ% zซึ่งรายงานออฟเซ็ตจาก UTC ในขณะที่รูปแบบมาตรฐาน (ผลลัพธ์นี้สำหรับเวลาเดนเวอร์, MDT):

$ date +%z
-0600

. . . ไม่สามารถใช้งานได้โดยตรงในการคำนวณตัวดัดแปลงที่เหมาะสมจะให้สิ่งที่เราต้องการ:

$ date +%-:::z
-6

ใส่ไว้พร้อมกับการแปลงวินาที / ชั่วโมง / วันตามปกติและฉันเชื่อว่าสิ่งต่อไปนี้ควรแสดงผลวันที่ตั้งแต่ 1/1/1970 โดยที่ 1/1/1970 นั้นจะเป็นศูนย์วันและการเพิ่มมูลค่าในเวลาท้องถิ่นเที่ยงคืน:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

การคำนวณอย่างง่ายนี้จะไม่ทำงานสำหรับเขตเวลาที่ไม่ได้ชดเชยจาก UTC ด้วยชั่วโมงทั้งหมด (เช่นอินเดีย TZ = เอเชีย / โกลกาตา) เนื่องจากdate +%-:::zข้อผิดพลาด"+5: 30" ที่ผลิตโดยจะสร้างข้อผิดพลาด "อักขระที่ไม่ถูกต้องในนิพจน์" เมื่อใช้ในคำสั่งด้านบน

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