วันที่จัดรูปแบบ YYYY-MM-DD ในเชลล์สคริปต์


1111

ฉันพยายามใช้$(date)ใน bash shell script ของฉัน แต่ฉันต้องการYYYY-MM-DDรูปแบบวันที่
ฉันจะได้รับสิ่งนี้ได้อย่างไร

คำตอบ:


1830

ใน bash (> = 4.2) ควรใช้ตัวจัดรูปแบบวันที่ในตัวของ printf (ส่วนหนึ่งของ bash) แทนที่จะใช้ตัวภายนอกdate(โดยปกติคือวันที่ของ GNU)

เช่นนี้:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

กำลังทุบตี (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

รูปแบบวันที่อื่น ๆ ที่มีอยู่สามารถดูได้จากหน้าวันที่ (สำหรับคำสั่งเฉพาะที่ไม่ใช่การทุบตีภายนอก):

man date

4
ในวันแรกของเดือนฉันได้รับ "2012-07-1" ซึ่งไม่ใช่สิ่งที่ OP ขอ
DerMike

6
มันใช้งานได้สำหรับฉัน หน้า Man แนะนำว่าช่วงแรกของเดือนคือ 01, no 1 (เช่น 2012-07-01)
Bob Kuhar

31
DATE = $ (วันที่ +% d-% m-% Y ""% H:% M:% S); สิ่งที่ฉันลงเอยหลังจาก
JacopKane

5
ฉันไม่ได้ตรวจสอบว่ามีช็อตคัตเหล่านี้ให้ใช้งานได้มากเพียงใด แต่ในการกระจายบางอย่างคุณสามารถใช้+%F %Tเป็นทางลัด+%Y-%m-%d %H:%M:%Sได้ เพิ่งทราบว่าระบบไฟล์ (ไอ ** HFS) บางตัวจะแปลง:เป็น a /ทำให้คุณมีสตริง2016-09-15 11/05/00ที่ทำให้คุณสับสน
จัดงาน

24
ไวยากรณ์ที่แนะนำในเปลือก POSIX สอดคล้องในสหัสวรรษนี้เป็นแทนdate=$(date) date=`date`นอกจากนี้อย่าใช้ตัวพิมพ์ใหญ่สำหรับตัวแปรส่วนตัวของคุณ ชื่อตัวแปรตัวพิมพ์ใหญ่ถูกสงวนไว้สำหรับระบบ
tripleee

335

ลอง: $(date +%F)


12
คนอ่านหน้าสำหรับวันที่:% F วันที่เต็ม; เช่นเดียวกับ% Y-% m-% d ดังนั้นนี่เป็นเพียงสัญลักษณ์ที่กระชับยิ่งขึ้นสำหรับคำตอบที่ยอมรับ
Håvard Geithus


47

คุณกำลังมองหารูปแบบวันที่มาตรฐานISO 8601ดังนั้นหากคุณมีวันที่ GNU (หรือคำสั่งวันที่ใด ๆ ที่ทันสมัยกว่า 1988) เพียงทำ:$(date -I)


9
ฉันมีคอมพิวเตอร์ Mac OS X รุ่นล่าสุด (และปี 1988) และdate -Iไม่ทำงาน มีการติดตั้งGNU coreutilsโดยใช้การชง (ซึ่งใช้คำนำหน้า 'g') gdate -Iทำงาน
Joel Purra

3
แปลก ฉันไม่สามารถหา-Iตัวเลือกเอกสารสำหรับ GNU แม้ว่านั่นเองค่ะดูเหมือนจะเทียบเท่ากับdate date +%F
chepner

3
OS X โดยทั่วไปเป็นความสูญเปล่า GPL v3 ดังนั้นพวกเขาจึงอาจไม่มีวันที่อัปเดตหรือ BASH เมื่อเร็ว ๆ นี้
Indolering

20
date -d '1 hour ago' '+%Y-%m-%d'

2015-06-14การส่งออกจะเป็น


3
ไม่ถูกต้องสำหรับคู่ของเหตุผลที่เห็นได้ชัดนี้จะช่วยให้วันที่ผิด 0:00-01:00 %และนอกจากคุณจบลงด้วยการ
Gerhard Burger

มันไม่เป็นความจริง. ควรเป็นเช่นคำพูดเดียวที่กระจัดกระจาย
Beyhan Gül

20
$(date +%F_%H-%M-%S)

สามารถใช้เพื่อลบโคลอน (:) ในระหว่าง

เอาท์พุต

2018-06-20_09-55-58

19

ด้วย Bash ล่าสุด (เวอร์ชั่น≥ 4.2) คุณสามารถใช้ builtin printfพร้อมกับตัวปรับรูปแบบ%(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfเร็วกว่ามากdateเนื่องจากเป็น Bash ในตัวขณะที่dateเป็นคำสั่งภายนอก

และprintf -v date ...เร็วกว่าdate=$(printf ...)เนื่องจากไม่ต้องใช้การฟอร์ดย่อย


4
ในฐานะที่เป็นโน้ตในปี 2019 คำสั่งนี้จะเร็วกว่าอย่างไม่น่าเชื่อ * มากกว่าdateถ้าคุณกำลังใช้สิ่งนี้จากสคริปต์ทุบตีอยู่แล้วเนื่องจากไม่จำเป็นต้องโหลดไลบรารีเพิ่มเติมใด ๆ (* ฉันวัดบนเซิร์ฟเวอร์ linux ของฉันด้วยความเร็วที่แตกต่างกัน ~ 160 เท่ามากกว่า 1,000 รอบซ้ำ)
38414

@timtj ขอบคุณที่ชี้ให้เห็น! ฉันเพิ่มหมายเหตุเกี่ยวกับความเร็วในการตอบ
wjandrea

1
ฉันหวังว่าฉันจะสามารถ +5 สำหรับความคิดเห็นเกี่ยวกับการprintf -v dateไม่หลอกลวงย่อย ข้อมูลที่ดีมาก !!
timtj

โดยปกติฉันจะใช้วันที่เพราะฉันต้องเพิ่มวันที่ด้วยเช่นกัน สามารถพิมพ์วันที่ทางคณิตศาสตร์ได้หรือไม่?
เมอร์ลิน

1
@ Merlin ฉันไม่คิดอย่างนั้น
wjandrea

8

เมื่อใดก็ตามที่ฉันมีงานเช่นนี้ฉันก็จะล้มลง

$ man strftime

เพื่อเตือนตัวเองถึงความเป็นไปได้ทั้งหมด


7

ถ้าคุณต้องการปีในรูปแบบตัวเลขสองตัวเช่น 17 มากกว่า 2017 ให้ทำดังนี้:

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

นี่คือ x คือวันที่ตัวอย่างที่ใช้แล้วตัวอย่างจะแสดงทั้งการจัดรูปแบบข้อมูลและรับวันที่มากกว่าวันที่ปัจจุบัน 10 นาที


6

ฉันใช้สูตรต่อไปนี้:

TODAY=`date -I`
echo $TODAY

ชำระเงินหน้าคนสำหรับdateมีตัวเลือกที่มีประโยชน์อื่น ๆ อีกมากมาย:

man date


1

คุณสามารถกำหนดวันที่เป็นตัวแปรสภาพแวดล้อมและหลังจากนั้นคุณสามารถใช้งานได้

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

หรือ

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.