การตรวจสอบวันที่ในเชลล์


14

ฉันต้องการตรวจสอบรูปแบบวันที่ด้านล่างในเชลล์สคริปต์

2015-Jul-13

ฉันใช้date -d "2015-Jul-13" +"%Y-%b-%d"แต่มันให้ข้อผิดพลาดเป็น

date: invalid date '2015-Jul-13'

@Pandya: OP มีความชัดเจนเกี่ยวกับคำถามของเขา / เธอ OP ต้องการตรวจสอบ (ตรวจสอบวันที่ที่ป้อนว่าถูกต้องหรือไม่) รูปแบบวันที่ที่กล่าวถึง แต่กำลังบอกว่าวันที่ที่ป้อนนั้นไม่ถูกต้อง
Thushi

GNU ไม่รู้จักdate YYYY-MMM-DDคุณสามารถใช้YYYY-MM-DDหรือDD MMM YYYYไม่?
roaima

ฉันค่อนข้างแน่ใจว่าatทำและ - ฉันคิดว่า - touchก็เช่นกัน ผมเขียน funvtion วันการตรวจสอบขึ้นอยู่กับเปลือกtouchครั้ง ... Nope ไม่touch- มันเท่านั้นจัดการกับตัวเลข แต่atไม่บางแยกลึกสวย ...
mikeserv

@Thushi ขอให้แสดงความคิดเห็นซ้ำซ้อนชัดเจนโดยเรา
พานเดรีย

6
เข้าใจผิดชื่อ: การตรวจสอบวันที่เป็นนรก
Adam Davis

คำตอบ:


12

GNU ไม่สนับสนุนdate แต่ก็ไม่เข้าใจYYYY-MMM-DD DD-MMM-YYYYดังนั้นถ้าคุณต้องจัดการกับวันที่ของรูปแบบนี้คุณสามารถทำได้ด้วยสิ่งนี้ซึ่งจะแลกเปลี่ยนอาร์กิวเมนต์ที่อยู่ในรูปแบบที่dateคาดไว้:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

นี่คือโซลูชันเชลล์ทั้งหมด ทำลายมันลงIFS=-คำแนะนำบอกเปลือกจะแยกบรรทัดคำสั่งเตรียมพร้อมด้วยยัติภังค์-แทนช่องว่าง set $ymdแยกวิเคราะห์$ymdตัวแปรสำหรับบรรทัดคำสั่ง แต่ตอนนี้แยกด้วยยัติภังค์กำหนดค่าพารามิเตอร์$1, $2 et seq echo "$3-$2-$1"นิดออกผลลัพธ์เป็นสามค่าบันทึกในการสั่งซื้อที่ตรงกันข้าม

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

@mikeserv: Coolness! มันทำงานร่วมกับ: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") คุณอาจเปิดเผยความมหัศจรรย์ที่อยู่เบื้องหลังsetคำสั่งหรือไม่?
joepd

11

จาก manpage: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

แต่ดูเหมือนว่าจะไม่รู้จักYYYY-MMM-DDรูปแบบ ดังนั้นคุณสามารถใช้อย่างใดอย่างหนึ่งจากด้านล่างหรือคล้ายกัน:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

หรือคุณต้องแปลง / จัดรูปแบบใหม่ก่อนที่จะส่งไปdate!

ดูที่คุณจะระบุรูปแบบสำหรับอินพุตเป็นอย่างไร


ผมขอแนะนำให้ไปเยี่ยมชม: รูปแบบการป้อนวันที่

นี่คือกฎ

สำหรับเดือนที่เป็นตัวเลขอนุญาตให้ใช้รูปแบบ ISO 8601 'ปีเดือนวัน' โดยที่ปีคือจำนวนบวกใด ๆ เดือนคือตัวเลขระหว่าง 01 ถึง 12 และวันคือตัวเลขระหว่าง 01 และ 31 ต้องมีศูนย์นำหน้า ถ้าตัวเลขน้อยกว่าสิบ ถ้าปี 68 หรือน้อยกว่า 2,000 จะถูกเพิ่มเข้าไป มิฉะนั้นถ้าปีน้อยกว่า 100 จะมีการเพิ่ม 1900 ยอมรับการสร้าง 'เดือน / วัน / ปี' ซึ่งเป็นที่นิยมในสหรัฐอเมริกา นอกจากนี้ 'เดือน / วัน' โดยไม่ข้ามปี

เดือนตามตัวอักษรอาจถูกสะกดเต็ม: 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', ' พฤศจิกายน 'หรือ' ธันวาคม ' เดือนตามตัวอักษรอาจจะยากที่จะอักษรสามตัวแรกของพวกเขาอาจตามด้วยตัวย่อจุด นอกจากนี้ยังอนุญาตให้เขียน 'Sept' แทน 'กันยายน'

เมื่อเขียนเป็นเดือนตัวอักษรวันที่ในปฏิทินอาจได้รับดังต่อไปนี้:

 วันเดือนปี
 วันเดือน
 เดือนวันปี
 วันวันเดือนปี

เน้นโดยฉัน

ที่นี่คุณจะเห็นว่าไม่มีรูปแบบเหมือนปีเดือนวัน ! (สำหรับเดือนที่เขียนอย่างแท้จริง)


7

ด้วยzshคุณสามารถใช้strftimebuiltin (ใช้ได้ผ่านzsh/datetime) กับ-r(ย้อนกลับ):

การประทับเวลารูปแบบ strftime -r

ซึ่งใช้รูปแบบเพื่อแยกวิเคราะห์การจับเวลาและส่งออกจำนวนวินาทีนับตั้งแต่ยุค:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

ข้อผิดพลาดนี้เกิดขึ้นหากวันที่ไม่ถูกต้อง:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: รูปแบบไม่ตรงกัน

นอกจากนี้คุณยังสามารถแปลงวินาทีนับตั้งแต่ยุคเป็นรูปแบบวันที่มาตรฐาน / กำหนดเองอื่น ๆ เช่น

strftime '%A, %B %d, %Y' 1447970400
วันศุกร์ที่ 20 พฤศจิกายน 2558
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.