คำสั่ง `date` บน OS X ไม่มีตัวเลือก ISO 8601` -I`


194

ในสคริปต์ Bash ฉันต้องการพิมพ์วันที่และเวลาปัจจุบันในรูปแบบISO 8601 (ควรเป็น UTC) และดูเหมือนว่าสิ่งนี้ควรเป็นเรื่องง่ายเหมือนdate -I:

http://ss64.com/bash/date.html

แต่นี่ดูเหมือนจะใช้งานไม่ได้บน Mac ของฉัน:

$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

และแน่นอนman dateไม่ได้แสดงรายการตัวเลือกนี้

ใครรู้ว่าทำไมเป็นเช่นนี้หรือวิธีอื่น ๆ (ง่าย) สำหรับฉันในการพิมพ์วันที่ในรูปแบบ ISO 8601 ขอบคุณ!


2
ในการชี้แจงฉันต้องการวันที่ ISO 8601 เต็มรูปแบบรวมถึงเวลาและควรอยู่ในเขตเวลา UTC
Aseem Kishore

ดีกว่าที่จะแก้ไขคำถาม คุณต้องการเวลาในรูปแบบใด
Tom Zych

@Tom: ถูกแก้ไข ตามรูปแบบ ISO 8601 นั้นไม่เจาะจงหรือไม่
Aseem Kishore

ไม่ ISO 8601 นั้นไม่เจาะจงพอ มาตรฐานนั้นระบุจำนวนรูปแบบของขอบเขตต่างๆ ทั้งสอง2011-08-27และ2011-08-27T18:55:43Zเป็นรูปแบบ ISO 8601 และจริงๆแล้วการแก้ไขคำถามจะมีประโยชน์มากกว่าที่จะทำการอัปเดตในความคิดเห็นต่างๆ ตัวอย่างของสิ่งที่คุณพยายามพิมพ์จะเหมาะ
Keith Thompson

6
มีการติดตั้งGNU coreutilsโดยใช้brew(ซึ่งใช้คำนำหน้า 'g') gdate -Iได้ทำงานพร้อมกับธง GNU อื่น ๆ
Joel Purra

คำตอบ:


348

คุณสามารถใช้

date "+%Y-%m-%d"

หรือสำหรับวันที่ที่ตรงตามมาตรฐาน ISO-8601 ให้ใช้หนึ่งในรูปแบบต่อไปนี้:

date -u +"%Y-%m-%dT%H:%M:%SZ"

เอาท์พุท:

2011-08-27T23:22:37Z

หรือ

date +%Y-%m-%dT%H:%M:%S%z

เอาท์พุท:

2011-08-27T15:22:37-0800

7
ในทางเทคนิคแนะนำให้ "T" แต่ไม่จำเป็นใน ISO 8601 การใช้ช่องว่างแทน 'T' จะเป็น: date -u + "% Y-% m-% d% H-% M-% SZ"
Bour Bourque

ที่สุด! ฉันเพิ่มสิ่งนี้ลงใน bash_alias ของฉัน
Christian Bongiorno

ใช่คำตอบที่ยอดเยี่ยมขอบคุณ! แต่นี่date -u +"%Y-%m-%dT%H:%MZ"คือสิ่งที่ฉันกำลังมองหา
ChikuMiku

3
@migigras: Zและ+00:00เหมือนกัน (ส่วนใหญ่) สำหรับจุดประสงค์ในการแปลทั้งสองเวลาแปลว่า UTC อย่างไรก็ตามอังกฤษอยู่+00:00ในช่วงฤดูหนาวและ+01:00ฤดูร้อน (BST)
Jeffrey Hulten

5
@JeffreyHulten: "พวกเขาทั้งคู่หมายถึง UTC" - Nitpick แต่Zเป็น UTC ขณะที่+00:00GMT UTC ไม่ใช่เขตเวลาและไม่มีการชดเชย offset ถูกกำหนดให้เป็นความแตกต่างของเวลาระหว่างเขตเวลาและ UTC ซึ่งเป็นมาตรฐานของการวัดเวลา GMT ถูกลบออกจาก UTC +00: 00 (และ BST คือตามที่คุณพูด +01: 00 ถูกนำออกจาก UTC)
Amadan

57

ในวัน GNU date -Iเป็นเช่นเดียวกับdate +%Fและ-Isecondsและ-Iminutesยังรวมถึงเวลาที่มีการชดเชย UTC

$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300

-uTZ=UTCเป็นเหมือน สามารถถูกแทนที่ด้วย+00:00Z

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

รูปแบบเหล่านี้เป็นรูปแบบวันที่หรือเวลา ISO 8601 ที่ถูกต้อง:

20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)

สิ่งเหล่านี้ไม่ใช่:

2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)

3
ไชโยสำหรับ + ​​"% FT% T% z" นั่นคือสิ่งที่ฉันต้องการ
Noah Yetter

22

ทางเลือกสั้น ๆ ที่ใช้งานได้ทั้งใน GNU และ BSD คือ:

date -u +%FT%T%z

7
หรือdate -u +%FT%TZเพราะใน UTC ชดเชยจะเป็นศูนย์ต่อไป
akostadinov

15

แพ็คเกจ coreutils จัดเตรียมเครื่องมือเวอร์ชัน GNU ติดตั้ง:

$ brew install coreutils

คุณสามารถดูสิ่งที่ให้:

$ brew list coreutils

แจ้งให้ทราบล่วงหน้ามันมาพร้อมกับวันที่:

$ brew list coreutils | grep date

นี่เป็นคำสั่ง date GNU มาตรฐานดังนั้นมันจะใช้สวิตช์ -I:

$ gdate -I
2016-08-09

1
หรือ: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
Olivier

5

เพียงใช้dateตัวเลือกการจัดรูปแบบปกติ:

date '+%Y-%m-%d'

แก้ไข: เพื่อรวมเวลาและ UTC สิ่งเหล่านี้เทียบเท่า:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

เพิ่มความคิดเห็นใน OP ของฉันโดยชี้แจงว่าฉันต้องการวันที่เต็มรูปแบบรวมถึงเวลาและควรอยู่ในเขตเวลา UTC ขอบคุณสำหรับเคล็ดลับแม้ว่า!
Aseem Kishore

3

มันไม่ใช่คุณสมบัติของ Bash แต่เป็นคุณลักษณะของdateไบนารี บน Linux คุณมักจะมี GNU coreutils เป็นรุ่นdateในขณะที่ OSX คุณจะมี BSD ยูทิลิตี้ดั้งเดิม เวอร์ชั่นของ GNU นั้นสามารถติดตั้งเป็นแพ็คเกจเสริมได้หรือคุณสามารถเปลี่ยนของคุณเองได้ - ผมเชื่อว่ามันควรจะเป็นซับไลน์แบบง่าย ๆ เช่นใน Perl


น่าสนใจขอบคุณ ฉันเป็น Mac / Linux / Unix / Bash noob; คุณอยากทราบรายละเอียดเกี่ยวกับ coreutils และวิธีการติดตั้งบน Mac หรือไม่? ขอบคุณ!
Aseem Kishore

2

หากตอบคำถามอีกขั้นหนึ่งคุณสามารถเพิ่มฟังก์ชันใน ~ / .bashrc หรือ ~ / .zshrc ของคุณเพื่อเพิ่มการ-Iตั้งค่าวันที่:

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}

1

มีcoreutilsแพ็คเกจที่คอมไพล์แล้วสำหรับ Mac OS X ที่:

http://rudix.org/packages-abc.html#coreutils

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