คุณสามารถคำนวณจำนวนวันตั้งแต่ 1/1/1970 ได้อย่างไร นี่สำหรับการอัพเดตแอ็ตทริบิวต์shadowLastChangeบน OpenLDAP
มีวิธีทำเช่นนี้โดยใช้คำสั่งlinux dateหรือไม่?
คุณสามารถคำนวณจำนวนวันตั้งแต่ 1/1/1970 ได้อย่างไร นี่สำหรับการอัพเดตแอ็ตทริบิวต์shadowLastChangeบน OpenLDAP
มีวิธีทำเช่นนี้โดยใช้คำสั่งlinux dateหรือไม่?
คำตอบ:
ring0 เอาชนะฉันภายในไม่กี่วินาที แต่คำสั่งเต็มคือ:
echo $(($(date --utc --date "$1" +%s)/86400))
สิ่งนี้ไปตามเวลา UTC ผลลัพธ์:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
การตรวจสอบอย่างรวดเร็วด้วย WolframAlphaแสดงให้เห็นว่านี่เป็นค่าที่ถูกต้อง
คำสั่งสามารถให้คุณจำนวนวินาทีตั้งแต่date
1970-01-01 00:00:00 UTC
date +"%s"
คุณสามารถหารผลลัพธ์ด้วย3600*24
การรับจำนวนวัน (UTC)
เช่นใน Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
เพื่อแสดงจำนวนวัน
ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด:
expr $(date +%s) / 86400
ฉันต้องการแก้ปัญหานี้เช่นกัน แต่ฉันต้องการได้รับคุณค่าที่เหมือนกันสำหรับวันที่ # โดยไม่คำนึงถึงเวลาของวัน ด้วยวิธีการเช่นที่แสดงที่นี่ค่าจะเปลี่ยนในเวลาเที่ยงคืน 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" ที่ผลิตโดยจะสร้างข้อผิดพลาด "อักขระที่ไม่ถูกต้องในนิพจน์" เมื่อใช้ในคำสั่งด้านบน
$()
เป็นที่ต้องการมากกว่า backticks สำหรับการอ่านและเหตุผลอื่น ๆecho $(( $(date ...) / 86400 ))