ฉันต้องการสิ่งที่เรียบง่ายเช่นdate
แต่ในวินาทีตั้งแต่ปี 1970 แทนที่จะเป็นวันที่ชั่วโมงนาทีและวินาทีปัจจุบัน
date
ดูเหมือนจะไม่เสนอตัวเลือกนั้น มีวิธีง่ายๆไหม?
ฉันต้องการสิ่งที่เรียบง่ายเช่นdate
แต่ในวินาทีตั้งแต่ปี 1970 แทนที่จะเป็นวันที่ชั่วโมงนาทีและวินาทีปัจจุบัน
date
ดูเหมือนจะไม่เสนอตัวเลือกนั้น มีวิธีง่ายๆไหม?
คำตอบ:
สิ่งนี้น่าจะใช้ได้:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
เป็น%s seconds since the epoch, 1970-01-01 00:00:00 UTC
เพราะฉันพลาดไปที่นั่น
date
ไม่ได้ถูกสร้างไว้bash
ดังนั้นเวอร์ชั่นของคุณbash
ไม่มีส่วนเกี่ยวข้องกับdate
การติดตั้งใช้งานระบบของคุณ
date +%s.%N
date +%s%3N
เพียงเพิ่ม
รับวินาทีตั้งแต่ยุค (1 มกราคม 1970) สำหรับวันใด ๆ (เช่น 21 ต.ค. 1973)
date -d "Oct 21 1973" +%s
แปลงจำนวนวินาทีเป็นวันที่
date --date @120024000
คำสั่งdate
ค่อนข้างเอนกประสงค์ สิ่งดีๆที่คุณสามารถทำอะไรกับวัน (คัดลอกจากลงคอdate --help
) แสดงเวลาท้องถิ่นสำหรับ 9:00 น. ในวันศุกร์หน้าบนชายฝั่งตะวันตกของสหรัฐอเมริกา
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
ยังดีกว่าใช้เวลาอ่าน man page http://man7.org/linux/man-pages/man1/date.1.html
date
หรือเพราะฉันใช้zsh
(macOS Catalina) แต่นี่ใช้ไม่ได้สำหรับฉัน เล่น$ date -d "Oct 21 1973" +%s
เอาท์พุทusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
date
เพื่อให้ห่างไกลคำตอบทั้งหมดใช้โปรแกรมภายนอก
ตั้งแต่ Bash 4.2 printf
มีตัวปรับแต่งใหม่%(dateformat)T
ที่เมื่อใช้กับอาร์กิวเมนต์-1
เอาต์พุตวันที่ปัจจุบันที่มีรูปแบบที่กำหนดโดยdateformat
จัดการstrftime(3)
( man 3 strftime
สำหรับข้อมูลเกี่ยวกับรูปแบบ)
ดังนั้นสำหรับโซลูชัน Bash ที่บริสุทธิ์:
printf '%(%s)T\n' -1
หรือถ้าคุณต้องการเก็บผลลัพธ์ไว้ในตัวแปรvar
:
printf -v var '%(%s)T' -1
ไม่มีโปรแกรมภายนอกและไม่มี subshells!
ตั้งแต่ทุบตี 4.3 มันเป็นไปได้ที่จะไม่ระบุ-1
:
printf -v var '%(%s)T'
(แต่อาจฉลาดกว่าที่จะให้การโต้แย้งเสมอ-1
)
หากคุณใช้-2
เป็นอาร์กิวเมนต์แทน-1
Bash จะใช้เวลาที่เชลล์เริ่มทำงานแทนวันที่ปัจจุบัน สามารถใช้เพื่อคำนวณเวลาที่ผ่านไป
$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
-2
ในกรณีที่คุณมีงานที่ยาวนานกว่า (คิดว่าสคริปต์เพื่อควบคุมการสำรองข้อมูลของคุณ) และส่งอีเมลในท้ายที่สุด "การสำรองข้อมูลเริ่มต้นที่ $ รายเมื่อเสร็จสมบูรณ์ที่ $ ตอนนี้" - ซึ่งสามารถทำได้โดย-2
หลีกเลี่ยงการจัดเก็บ ตัวแปรเฉพาะที่จุดเริ่มต้น
ด้วยการใช้งาน Awk ส่วนใหญ่:
awk 'BEGIN {srand(); print srand()}'
srand()
มักจะ seeded กับวันที่ / เวลาปัจจุบัน การเรียกครั้งที่สองเพื่อsrand()
คืนค่าที่ใช้ก่อนหน้านี้เป็นเมล็ด
ตั้งแต่bash
5.0 ( เผยแพร่เมื่อ 7 ม.ค. 2019 ) คุณสามารถใช้ตัวแปรบิวด์อินEPOCHSECONDS
ได้
$ echo $EPOCHSECONDS
1547624774
นอกจากนี้ยังมีEPOCHREALTIME
ซึ่งรวมถึงเศษส่วนของวินาที
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
สามารถแปลงเป็นไมโครวินาที (μs) โดยการลบจุดทศนิยม สิ่งนี้อาจเป็นที่สนใจเมื่อใช้bash
เลขคณิตในตัว(( expression ))
ซึ่งสามารถจัดการกับจำนวนเต็มได้เท่านั้น
$ echo ${EPOCHREALTIME/./}
1547624774371215
ในตัวอย่างทั้งหมดจากด้านบนค่าเวลาที่พิมพ์มีค่าเท่ากันเพื่อให้อ่านง่ายขึ้น ในความเป็นจริงค่าเวลาจะแตกต่างกันเนื่องจากแต่ละคำสั่งใช้เวลาเล็กน้อยในการดำเนินการ
date +%s%3N
) คุณสามารถใช้echo $(( ${EPOCHREALTIME/./} / 1000 ))
นี่เป็นส่วนขยายของ @pellucide ที่ทำไปแล้ว แต่สำหรับ Macs:
เพื่อกำหนดจำนวนวินาทีตั้งแต่ epoch (1 มกราคม 1970) สำหรับวันที่ที่ระบุ (เช่น 21 ต.ค. 1973)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
โปรดทราบว่าเพื่อความสมบูรณ์ฉันได้เพิ่มส่วนของเวลาในรูปแบบ เหตุผลก็คือdate
จะมีส่วนใดวันที่คุณให้มันและเพิ่มเวลาปัจจุบันให้กับค่าที่ให้ไว้ ตัวอย่างเช่นหากคุณรันคำสั่งด้านบนเวลา 16:19 PM โดยไม่มีส่วน '00: 00: 00 'จะเพิ่มเวลาโดยอัตโนมัติ เช่นนี้ "21 ต.ค. 1973" จะถูกแยกวิเคราะห์เป็น "21 ต.ค. 1973 16:19:00" นั่นอาจไม่ใช่สิ่งที่คุณต้องการ
วิธีแปลงเวลาประทับกลับเป็นวันที่:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
หน้า man ของ Apple สำหรับการนำไปใช้งานวันที่: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
date
คำสั่งในขณะที่การแก้ปัญหาใด ๆ ที่แนะนำdate -d
สำหรับ date
GNU วันที่ BSD ใน macOS มาจาก FreeBSDและแบ่งปันตัวเลือกจำนวนมากกับ NetBSD และ OpenBSD และนี่คือทั้งหมดที่แยกออกจากทุบตี
%N
ตัวเลือกที่กล่าวถึงวินาทีเศษส่วนในวัน GNU จะหายไปจากวัน MacOS ใน 10.14 ไม่มีรูปแบบใดที่อยู่ในหน้า man; พวกมันอยู่ในstrftime(3)
man page ซึ่งคุณจะไม่มีหากคุณไม่ได้ติดตั้ง Xcode และอาจไม่เห็นคำสั่ง man แม้ว่าคุณจะทำก็ตาม
ใช้สคริปต์ทุบตีนี้ (ของฉัน~/bin/epoch
):
#!/bin/bash
# get seconds since epoch
test "x$1" == x && date +%s && exit 0
# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"