แปลงการประทับเวลา Unix เป็นสตริงวันที่


129

มีวิธีง่ายๆในการแปลงการประทับเวลา Unix เป็นวันที่จากบรรทัดคำสั่ง Unix หรือไม่?

dateอาจใช้งานได้ยกเว้นว่าจะค่อนข้างอึดอัดในการระบุแต่ละองค์ประกอบ (เดือนวันปีชั่วโมง ฯลฯ ) และฉันไม่สามารถหาวิธีทำให้มันทำงานได้อย่างถูกต้อง ดูเหมือนว่าอาจมีวิธีที่ง่ายกว่านี้ - ฉันขาดอะไรไปหรือเปล่า?


คำตอบ:


181

ด้วย GNU dateคุณสามารถทำได้:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(จาก: BASH: แปลง Unix Timestamp เป็นวันที่ )

บน OS X date -rใช้

date -r "$TIMESTAMP"

strftime()อีกวิธีหนึ่งคือการใช้งาน มันไม่สามารถใช้ได้โดยตรงจากเปลือก, แต่คุณสามารถเข้าถึงได้ผ่านทางเพ่งพิศ ตัว%cระบุจะแสดงการประทับเวลาในลักษณะที่ขึ้นกับโลแคล

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

3
อย่าลืมกำจัดมิลลิวินาทีออกจากการประทับเวลา (ซึ่งเป็นตัวเลขเพียง 10 หลักแทนที่จะเป็น 13) มิฉะนั้นคุณจะได้ผลลัพธ์ที่ไม่ถูกต้อง (ซึ่งเป็นจริงสำหรับวันที่ของ macOS)
Emerino

ฉันคิดว่าสิ่งนี้ใช้ไม่ได้จนกว่าฉันจะรู้ว่ามีการประทับเวลาเป็นมิลลิวินาที ตัดตัวเลข 3 หลักสุดท้ายออกแล้วคุณจะได้เวลาที่แม่นยำ
สจ๊วต

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' โดยตัวเลขที่อยู่ข้างหลัง@คือตัวเลขในหน่วยวินาที


28
ใน OSX 10.8 ของมันdate -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) หรือเพียงแค่date -r 1278999698
ทอม McKenzie

ใช้ได้กับ Ubuntu 16.04
Mike Q

24

date -d @การแก้ปัญหานี้ทำงานร่วมกับรุ่นของวันที่ไม่สนับสนุน ไม่ต้องใช้AWKหรือคำสั่งอื่น ๆ การประทับเวลา Unix คือจำนวนวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970 UTC ดังนั้นการระบุ UTC จึงเป็นสิ่งสำคัญ

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

หากคุณใช้ Mac ให้ใช้:

date -r 1357004952

คำสั่งในการรับยุค:

date +%s
1357004952

เครดิตไปที่ Anton: BASH: แปลง Unix Timestamp เป็นวันที่


10

ดังที่ @TomMcKenzie กล่าวในความคิดเห็นสำหรับคำตอบอื่น date -r 123456789เป็นวิธีแก้ปัญหาง่ายๆที่ใช้กันทั่วไป (เช่นใช้กันอย่างแพร่หลายมากขึ้น) สำหรับเวลาที่กำหนดเป็นวินาทีนับตั้งแต่ Unix Epoch แต่น่าเสียดายที่ไม่มีโซลูชันพกพาที่รับประกันสากล

-dตัวเลือกในหลายประเภทของระบบหมายถึงสิ่งที่แตกต่างอย่างสิ้นเชิงกว่า GNU วันของ--dateส่วนขยาย น่าเศร้าที่ GNU Date ไม่ได้แปลความหมาย-rเหมือนกับการใช้งานอื่น ๆ เหล่านี้ น่าเสียดายที่คุณต้องรู้ว่าdateคุณกำลังใช้เวอร์ชันใดและdateคำสั่งUnix รุ่นเก่าจำนวนมากไม่รองรับตัวเลือกใดตัวเลือกหนึ่ง

ที่แย่ไปกว่านั้น POSIX dateไม่รู้จัก-dหรือ-rและไม่มีวิธีมาตรฐานในคำสั่งใด ๆ เลย (ที่ฉันรู้จัก) เพื่อจัดรูปแบบเวลา Unix จากบรรทัดคำสั่ง (เนื่องจากไม่มี POSIX Awk ด้วยstrftime()) (คุณไม่สามารถใช้งานได้touch -tและlsเนื่องจากอดีตไม่ยอมรับเวลาที่กำหนดให้เป็นวินาทีนับตั้งแต่ Unix Epoch)

โปรดทราบว่า The One True Awk พร้อมใช้งานโดยตรงจาก Brian Kernighan ขณะนี้มีstrftime()ฟังก์ชันในตัวเช่นเดียวกับsystime()ฟังก์ชันในการคืนเวลาปัจจุบันเป็นวินาทีตั้งแต่ Unix Epoch) ดังนั้นโซลูชัน Awk อาจเป็นแบบพกพาได้มากที่สุด


4

หากคุณพบว่าสัญกรณ์ไม่สะดวกบางที-R-option อาจช่วยได้ มันเกินวันที่ในรูปแบบ RFC 2822 date -d @1278999698 -Rดังนั้นคุณจะไม่จำเป็นต้องระบุที่ทุกคน: date -d @1278999698 +%cเป็นไปได้ก็คือการส่งออกวันในไม่กี่วินาทีในภาษาของคุณ: ควรจำง่าย. :-)


2

แก้ไขเล็กน้อยสำหรับคำตอบของ dabest1 ด้านบน ระบุเขตเวลาเป็น UTC ไม่ใช่ GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

ข้อที่สองถูกต้อง ฉันคิดว่าเหตุผลก็คือในสหราชอาณาจักรการออมแสงมีผลบังคับใช้อย่างต่อเนื่องตั้งแต่ปี พ.ศ. 2511 ถึง พ.ศ. 2514


2

โซลูชัน Perl มาตรฐานคือ:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(หรือตามเวลาท้องถิ่นหากต้องการ)



1

ตัวอย่างอื่น ๆ ที่นี่เป็นเรื่องยากที่จะจำ อย่างง่ายที่สุด:

date -r 1305712800

ผลลัพธ์แบบผสม: ใช้ไม่ได้ใน ubuntu Linux แต่ทำใน MacOS X เช่น
Mike Q

1

ใส่สิ่งต่อไปนี้ใน ~ / .bashrc ของคุณ:

function unixts() { date -d "@$1"; }

ตัวอย่างการใช้งาน:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

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