รับเวลาปัจจุบันเป็นวินาทีตั้งแต่ Epoch บน Linux, Bash


633

ฉันต้องการสิ่งที่เรียบง่ายเช่นdateแต่ในวินาทีตั้งแต่ปี 1970 แทนที่จะเป็นวันที่ชั่วโมงนาทีและวินาทีปัจจุบัน

dateดูเหมือนจะไม่เสนอตัวเลือกนั้น มีวิธีง่ายๆไหม?


22
ขออภัยฉันต้องบอกว่า .... '' วันที่ดูเหมือนจะไม่มีตัวเลือกนั้น มีวิธีที่ง่ายไหม '' - อ่านคู่มืออีกครั้ง ;-)
TheBbean

7
บางรุ่นมีวันที่และบางวันไม่มี ดังนั้นจึงไม่ปรากฏขึ้นเสมอ ฉันวิ่ง 'พิมพ์ -a date' และใช้รุ่นอื่นและใช้งานได้
Scott Rowley

1
FWIW, Ubuntu มี / bin / date เท่านั้นซึ่งคำตอบของ @ Steef ใช้ได้
Jonathan Hartley

1
@TheBawai ที่ไม่ได้เป็นส่วนหนึ่งของเครื่องมือ 'วันที่' รุ่นมาตรฐาน POSIX เพียงเพราะรุ่นของคุณมี (อาจเป็น GNU) คุณไม่ควรถือว่าการใช้งานของทุกคนทำได้
Wyatt8740

คำตอบ:


1159

สิ่งนี้น่าจะใช้ได้:

date +%s

45
manpge วันที่ควรเปลี่ยนจาก%s seconds since 1970-01-01 00:00:00 UTCเป็น%s seconds since the epoch, 1970-01-01 00:00:00 UTCเพราะฉันพลาดไปที่นั่น
devin

3
ไม่ได้ผลสำหรับฉัน วันที่ของคนไม่แสดง% s ฉันต้องมี bash รุ่นเก่ามาก (3.2.51 (1) สำหรับ Solaris) หรือไม่
livefree75

7
@ livefree75 dateไม่ได้ถูกสร้างไว้bashดังนั้นเวอร์ชั่นของคุณbashไม่มีส่วนเกี่ยวข้องกับdateการติดตั้งใช้งานระบบของคุณ
Adrian Frühwirth

11
และถ้าคุณต้องการเศษเสี้ยวของวินาที, ทศนิยมเก้าตำแหน่ง, ใช้:date +%s.%N
Jonathan Hartley

19
สำหรับมิลลิวินาทีใช้date +%s%3N
Juan Campa

133

เพียงเพิ่ม

รับวินาทีตั้งแต่ยุค (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


นี่ไม่ใช่คำถามของ OP แต่เป็นคำตอบของฉันดังนั้น +1 จากฉัน
AnthonyD973

อาจเป็นรุ่น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]
โจชัวพิ

43

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เป็นอาร์กิวเมนต์แทน-1Bash จะใช้เวลาที่เชลล์เริ่มทำงานแทนวันที่ปัจจุบัน สามารถใช้เพื่อคำนวณเวลาที่ผ่านไป

$ 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

9
คุณต้องการใช้-2ในกรณีที่คุณมีงานที่ยาวนานกว่า (คิดว่าสคริปต์เพื่อควบคุมการสำรองข้อมูลของคุณ) และส่งอีเมลในท้ายที่สุด "การสำรองข้อมูลเริ่มต้นที่ $ รายเมื่อเสร็จสมบูรณ์ที่ $ ตอนนี้" - ซึ่งสามารถทำได้โดย-2หลีกเลี่ยงการจัดเก็บ ตัวแปรเฉพาะที่จุดเริ่มต้น
เซบาสเตียนเจ

23

ด้วยการใช้งาน Awk ส่วนใหญ่:

awk 'BEGIN {srand(); print srand()}'

21
ว้าวนั่นไม่ชัดเจน
ericslaw

8
ว้าวต้องไปลองดูอันนี้สิ นี่เป็นวิธีแก้ปัญหา แต่ไม่จำเป็นต้องดี / พกพา ดูเหมือนว่าการใช้งานของ awksrand()มักจะ seeded กับวันที่ / เวลาปัจจุบัน การเรียกครั้งที่สองเพื่อsrand()คืนค่าที่ใช้ก่อนหน้านี้เป็นเมล็ด
Ryan Ransford

23

วิธีทุบตีบริสุทธิ์

ตั้งแต่bash5.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 ))
luckman212

19

นี่เป็นส่วนขยายของ @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


1
ต้องมีความชัดเจนนี้เป็น BSD ของdateคำสั่งในขณะที่การแก้ปัญหาใด ๆ ที่แนะนำdate -dสำหรับ dateGNU วันที่ BSD ใน macOS มาจาก FreeBSDและแบ่งปันตัวเลือกจำนวนมากกับ NetBSD และ OpenBSD และนี่คือทั้งหมดที่แยกออกจากทุบตี
ghoti

%Nตัวเลือกที่กล่าวถึงวินาทีเศษส่วนในวัน GNU จะหายไปจากวัน MacOS ใน 10.14 ไม่มีรูปแบบใดที่อยู่ในหน้า man; พวกมันอยู่ในstrftime(3)man page ซึ่งคุณจะไม่มีหากคุณไม่ได้ติดตั้ง Xcode และอาจไม่เห็นคำสั่ง man แม้ว่าคุณจะทำก็ตาม
Dan Pritts

1

ใช้สคริปต์ทุบตีนี้ (ของฉัน~/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" "$@"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.