ฉันจะได้รับวันที่จัดรูปแบบสำหรับการประทับเวลา UNIX จากบรรทัดคำสั่งได้อย่างไร


59

ฉันมีการประทับเวลา UNIX และฉันต้องการรับวันที่จัดรูปแบบ (เช่นผลลัพธ์ของdate) ที่สอดคล้องกับการประทับเวลานั้น

ความพยายามของฉันจนถึง:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

ฉันต้องการที่จะได้รับผลลัพธ์เช่น:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

คำตอบ:


91

บน Mac OS X และ BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

ด้วยเครื่องมือหลักของ GNU (คุณต้องขุดผ่านไฟล์ข้อมูลสำหรับสิ่งนั้น):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

ด้วยการเพิ่ม-uตัวเลือก (มาตรฐาน) หรือส่งผ่านTZ=UTC0ตัวแปรสภาพแวดล้อมเพื่อให้มีวันที่ UTC ( TZ=UTC0 กำหนดเขตเวลาที่เรียกว่าUTCมี offset 0 จาก UTC ในขณะที่พฤติกรรมของTZ=UTC(โดยไม่มีการชดเชย) จะไม่ได้รับการระบุ (แม้ว่าในระบบส่วนใหญ่จะอ้างถึง เขตเวลาที่ระบบกำหนดเรียกว่าUTCด้วย offset 0 จาก UTC))


1
มันต้องใช้เวลาขุดมากซึ่งน่าแปลกใจสำหรับงานทั่วไปเช่นนั้น
David Z

ขอบคุณตอบรับคำตอบของคุณ ฉันควรอ่านinfo coreutils dateอย่างละเอียดอีกหน่อย
Umang

นี้จะให้ฉันวันที่แตกต่างกันเล็กน้อย: date -r 1447264553943ผลลัพธ์ในเมื่อมันเป็นจริงWed Dec 28 01:39:03 BRST 47831 11/11/2015, 3:55:53 PM GMT-2:00
falmp

1
@falmp: มันจะทำงานถ้าคุณใช้วินาทีแทน microseconds

@hop ops ควรจะคิดได้ว่าปี 47831 เป็นอย่างไร แต่ตัวเลขนั้นสูงมากฉันก็พลาดไป ขอบคุณ!
falmp

6

หลังจาก googling ฉันพบวิธีที่จะทำได้ด้วยdateคำสั่งเท่านั้น:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

ขอบคุณสำหรับสิ่งนั้น ฉันหวังว่าจะมีบางสิ่งที่ง่ายกว่าดังนั้นเพียงแค่โหวตตอนนี้
Umang

อีกหนึ่งตัวอย่างที่ดีว่า Google ทำให้คุณโง่ได้อย่างไร ไม่มีใครเคยอ่านเอกสารอีกแล้ว?

1
@hop date -d @xxxไม่ได้เพิ่มการสนับสนุนจนกว่า coreutils 5.3 ในปี 2005 นั่นคือวิธีที่คุณต้องทำก่อนหน้านั้น
Stéphane Chazelas

@ StéphaneChazelas: a) คำตอบนี้มาจาก 2010 และ b) ทำไมข้ออ้างนี้จึงทำให้ googling ก่อนอ่านเอกสาร? หากคุณตอบจากอำนาจของคุณเองคุณสามารถแก้ไขข้อผิดพลาดเช่นนี้ได้ แต่ถ้าคุณต้องค้นหามันอยู่ดี

@hop ฉันแค่ชี้ให้เห็นว่ามันไม่ใช่คำตอบที่โง่เพียงคำตอบที่ล้าสมัย
Stéphane Chazelas

6

Perl หนึ่งซับนี้จะทำมัน:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010

5

ด้วยเชลล์บิวอิน:

  • zsh (4.1.1 (2003) และสูงกว่า):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93( ksh93i(2000) และสูงกว่า):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2 (2010) และสูงกว่า):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

ในทุกสิ่งให้แทนที่%cด้วยstrftime()รูปแบบที่คุณต้องการ


คุณมีการอ้างอิงสำหรับการbash printfแก้ปัญหาหรือไม่?
Derek Mahar

ไม่เป็นไรฉันพบในคำอธิบายของprintfในgnu.org/software/bash/manual/bashref.html#Bash-Builtins
Derek Mahar

2

บน osx, ที่จะมีใน UTC

date -r "1475737200" -u

ขอบคุณ ฉันได้แก้ไขว่าในคำตอบที่ยอมรับแล้วดังนั้นจึงมีข้อมูลที่พร้อมใช้งาน
Stéphane Chazelas

1

อีกตัวอย่างที่ชัดเจนของมรดกอันยาวนานของ Unix ที่ทันสมัย นี่เป็นไปได้จริงภายใต้ตัวแปร BSD ส่วนใหญ่:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW ตัวอย่างของคุณดูเหมือนจะถูกปิดภายในหนึ่งวินาที)


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

1

ตอบคำถามเก่า แต่ฉันคิดว่านี่อาจเป็นการปรับปรุงหากใครก็ตามที่ค้นหาสิ่งนี้ ฟังก์ชั่น Bash นี้ทำงานได้ทั้งบน Linux และ OS X ฉันไม่ได้ทดสอบกับระบบ BSD อื่น ๆ ส่งผ่านเวลาของยุคเป็นอาร์กิวเมนต์ไปยังฟังก์ชันนี้และจะพิมพ์รูปแบบเวลา RFC-3339

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.