คำสั่งมาตรฐานสำหรับการพิมพ์วันที่ในรูปแบบ RFC-3339 คืออะไร?


19

dateคำสั่งไม่ได้มีสิ่งดังกล่าวซึ่งเป็นชนิดของเศร้าตั้งแต่ RFC-3339 เป็นที่ทันสมัยอย่างกว้างขวาง, รูปแบบมีสติใช้ทุกที่ (ยกเว้นในอีเมลซึ่งเป็นค่าที่ทันสมัยมิได้มีสติ)

เขตเวลาของฉันชดเชยในปัจจุบันคือ -08: 00 2013-09-05T14:58:33.102-08:00เพื่อให้รูปแบบที่ง่ายของคำสั่งนี้ควรพิมพ์เวลาปัจจุบันเป็น


มาตรฐานใดที่คุณสนใจ
Stéphane Chazelas

ฉันเองก็ดีกับ GNU แต่ในรูปแบบที่ยิ่งใหญ่ของสิ่งต่าง ๆ มันควรกว้างกว่านั้นจริงๆ ควรมาพร้อมกับค่าเริ่มต้นที่สมเหตุสมผล (ตัวเลือกสั้นความแม่นยำมิลลิวินาที) และมีวิธีการระบุความแม่นยำรอง (จำนวนหลักอื่นที่ไม่ใช่ 0 หรือ 9)
Martin Jambon

1
มันไม่ใช่รูปแบบที่มีสติ: การไม่มีพื้นที่ว่างทั้งหมดทำให้ยากต่อการอ่านของมนุษย์โดยไม่จำเป็น คุณควรใช้รูปแบบที่เปลี่ยนแปลงเล็กน้อย2013-09-05 14:58:33.102 -0800ยกเว้นเมื่อมีเหตุผลบางประการที่ต้องไม่เว้นช่องว่างเลย
zwol

1
ฉันเปรียบเทียบมันกับรูปแบบวันที่จดหมาย (RFC 822, 2822) ซึ่งอ่านยากสำหรับทั้งมนุษย์และเครื่องจักร
Martin Jambon

คำตอบ:


30

ดูเหมือนว่าคุณสามารถทำได้หลายรูปแบบโดยใช้สวิทช์ในการดำเนินงานของกนูdate(เวอร์ชั่น 5.90 --rfc3339=หรือสูงกว่า)

ตัวอย่าง

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

หากคุณต้องการที่Tจะเพิ่มเป็นแฮ็ค:

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

หากคุณต้องการในหน่วยมิลลิวินาที:

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

อ้างอิง


7
ทุกวันนี้ไม่จำเป็นต้องแฮ็กเพื่อรับ 'T' --iso-8601' option accepts the same arguments as --rfc-3339` และรวมถึง T 'ในการส่งออกของ
Ti Strga

1
ส่วนที่เงียบสงบs/\(\....\).*-/\1-/gควรที่จะs/\(\....\).*\([+-]\)/\1\2/gทำงานทางตะวันออกของมหาสมุทรแอตแลนติกด้วย
svante

1
@svante - ขอบคุณสำหรับรายละเอียดการแก้ไข
slm

2
@Eonil ที่ไม่ถูกต้องจริงรัฐ RFC3339: NOTE: ISO 8601 defines date and time separated by "T".ในขณะที่ RFC3339 ช่วยให้คุณใช้พื้นที่แทน อ่านietf.org/rfc/rfc3339.txtมาตรา 5.6
rwenz3l

1
@ rwenz3l ความผิดของฉัน ฉันเพิ่งอ่านเพียงส่วนหนึ่งของ ABNF และพลาดโน้ต ขอบคุณที่ชี้นำ!
Eonil

18

ด้วย GNU date(5.90 ขึ้นไป):

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

แทนที่%Nด้วยหน่วย%3Nมิลลิวินาทีเป็น%6Nเวลาไมโครวินาที ...

AFAIK ข้อมูลจำเพาะ POSIX, Unix หรือ LSB ไม่ระบุคำสั่งใด ๆ ที่สามารถแสดงเวลาที่มีความละเอียดย่อยที่สอง แต่ส่วนที่เป็นเศษส่วนเป็นตัวเลือกใน RFC 3339

POSIX / Unix / LSB strftime รองรับ%zการแสดงค่าชดเชย TZ -0800ดังนั้นอุปกรณ์พกพาที่คุณอาจได้รับคือ:

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

GNU dateมีรูปแบบ ISO-8601 ในตัว - นั่นไม่ได้ใกล้เคียงหรือแม้แต่กับ RFC-3339

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601 ช่วยให้รูปแบบวันที่และเวลาแตกต่างกัน แต่ฉันคิดว่า OP ขอรูปแบบวันที่ W3Cโดยเฉพาะ"วันที่สมบูรณ์พร้อมชั่วโมงนาทีวินาทีและเศษทศนิยมวินาที YYYY-MM-DDThh: mm: ss.sTZD (เช่น 1997-07-16T19: 20: 30.45 + 01: 00)" - วันที่และเวลา W3C รูปแบบ
hakre

8

อายุเท่าไหร่ที่ดี:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

ข้อมูลโซนเวลาอยู่ที่ไหน
Raphael Ahrens

สิ่งนี้ใช้ได้ทั้งบน mac และ linux 'date'
Eran Chetzroni

1
มิลลิวินาทีเป็นอย่างไร
Martin Jambon

6
บันทึกย่อแบบด่วนที่นี่โดยไม่ต้องเปิด RFC ซึ่งเป็นส่วนของเขตเวลา0200นั้นไม่มีเครื่องหมายโคลอนซึ่งอาจทำให้ระบบบางระบบต้องใช้งานได้
Mike Mackintosh

2
@ บันทึกของ MikeMackintosh นั้นตรงประเด็น; เอาต์พุตที่แสดงที่นี่ไม่ใช่วันที่ตามกฎหมาย RFC 3339 จำเป็นต้องใช้โคลอนในส่วนของเขตเวลาสำหรับ RFC 3339 ดูความหมายของtime-numoffsetที่tools.ietf.org/html/rfc3339#section-5.6
Mark Amery

7

คุณสามารถจัดรูปแบบเวลาตามRFC3339 (ISO8601)ได้ง่ายขึ้น:

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

หมายเหตุ:รูปแบบนี้ใช้ในLabel Schema Convention RC 1.0 ด้วย


นั่นไม่ใช่ RFC3339 ที่ถูกต้อง คำตอบของ Eran ในวันที่ `+`% +% Y-% m-% dT% T% z `` `ถูกต้องและตัวอักษรน้อยลง หากคุณต้องการในแฟล็ก UTC pass -u ซึ่งจะทำให้ออฟเซ็ตเขตเวลาเป็นศูนย์
briceburg

ด้วยการ-uตั้งค่าสถานะคำตอบนี้ถูกต้องใช่ไหม
Lassi

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

คำสั่งเหล่านี้สามารถทำงานร่วมกับ POSIX ได้ด้วยข้อยกเว้นของ%zข้อกำหนดการแปลง อย่างไรก็ตาม%zได้รับการสนับสนุนอย่างกว้างขวางและทำงานในลักษณะเดียวกันใน Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix และ Haiku นอกจากนี้ยังทำงานร่วมกับเครื่องมือใน Busybox, Toybox และ sbase (ยูทิลิตี้ระบบพื้นฐานของ suckless.org) เนื่องจาก%zเอาต์พุตออฟเซ็ตเขตเวลาอยู่ใน±HHMMรูปแบบเราจึงต้องการsed±HH:MMท่อเพื่อเพิ่มลำไส้ใหญ่และเปลี่ยนเป็น

หมายเหตุ: dateคำสั่งของโครงการ Heirloom มี%zเอาต์พุตที่เข้ากันไม่ได้: มันไม่ได้พิมพ์+เครื่องหมาย

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