Dateutils เป็นกลุ่มเครื่องมือที่เกี่ยวข้องกับการเล่นซอกับวันที่และเวลาบนบรรทัดคำสั่งโดยเน้นไปที่กรณีการใช้งานที่เกิดขึ้นเมื่อต้องจัดการกับข้อมูลทางการเงินจำนวนมาก
Dateutils โฮสต์บน GitHub เป็นหลัก:
หน้า GitHub: https://github.com/hroptatyr/dateutils
หน้าแรกของโครงการ: http://www.fresse.org/dateutils/
ดาวน์โหลด: https://bitbucket.org/hroptatyr/dateutils/downloads
ด้านล่างนี้คือรายการตัวอย่างสั้นๆ ที่แสดงให้เห็นว่า dateutils ทำอะไรได้บ้าง สำหรับรายละเอียดแบบเต็ม โปรดดูที่ข้อมูลและหน้าคู่มือ สำหรับคำแนะนำในการติดตั้ง โปรดดูที่ไฟล์ INSTALL
คำสั่ง Dateutils นำหน้าด้วย date
แต่มีลักษณะคล้ายกับคำสั่งยูนิกซ์ที่รู้จักด้วยเหตุผลของสัญชาตญาณ ข้อยกเว้นเดียวคือ strptime
ซึ่งคล้ายคลึงกับฟังก์ชัน libc ที่มีชื่อเดียวกัน
เวอร์ชันบรรทัดคำสั่ง strptime
ของฟังก์ชัน C
dateadd
เพิ่มระยะเวลาให้กับวันที่หรือเวลา
dateconv
แปลงวันที่หรือเวลาระหว่างปฏิทิน
datediff
คำนวณระยะเวลาระหว่างวันที่หรือเวลา
dategrep
Grep วันที่หรือเวลาในสตรีมอินพุต
dateround
ปัดวันที่หรือเวลาเป็นค่า "fuller"
dateseq
สร้างลำดับของวันที่หรือเวลา
datesort
เรียงลำดับตามลำดับเวลา
datetest
เปรียบเทียบวันที่หรือเวลา
datezone
แปลงวันที่/เวลาเป็นเขตเวลาเป็นกลุ่ม
ฉันชอบทุกสิ่งที่อธิบายด้วยตัวอย่างเพื่อสร้างความประทับใจแรกพบ มันก็เลยมา..
เครื่องมือเลียนแบบ seq(1) แต่อินพุตมาจากโดเมนของวันที่แทนที่จะเป็นจำนวนเต็ม โดยทั่วไปแล้วสคริปต์จะใช้สิ่งที่ต้องการ
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
ซึ่งตอนนี้สามารถย่อให้สั้นลงได้
$ dateseq 2010-01-01 2010-01-10
พร้อมสิทธิประโยชน์เพิ่มเติมที่สามารถให้วันที่สิ้นสุดได้โดยตรง แทนที่จะคำนวณจากวันที่เริ่มต้นและช่วงเวลาเป็นวัน นอกจากนี้ยังมีฟีเจอร์เฉพาะวันที่ซึ่งจะเป็น PITA ที่จะนำไปใช้โดยใช้วิธี seq(1)/date(1) ข้างต้น เช่น การข้ามวันธรรมดาบางวัน:
$ dateseq 2010-01-01 2010-01-10 --skip sat,sun => 2010-01-01 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08
dateseq ยังใช้งานได้ตามเวลา:
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
และวันที่-เวลา:
$ dateseq --compute-from-last 2012-01-02T12:00:00 5m 2012-01-02T12:17:00 => 2012-01-02T12:02:00 2012-01-02T12:07:00 2012-01-02T12:12:00 2012-01-02T12:17:00
เครื่องมือในการแปลงวันที่ระหว่างระบบปฏิทินและ/หรือโซนเวลาต่างๆ แม้ว่าเครื่องมืออื่นๆ ดังกล่าวมักจะมุ่งเน้นไปที่การแปลงวันที่แบบคริสต์ศักราชเป็นปฏิทินจีน แต่ dconv มีเป้าหมายที่จะสนับสนุนระบบปฏิทินซึ่งจำเป็นในบริบททางการเงิน
ในการแปลงวันที่ (เกรกอเรียน) เป็นสิ่งที่เรียกว่าการแทนค่า ymcw:
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
และในทางกลับกัน:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
โดยที่การแสดง ymcw หมายถึง %c
-th %w
ของเดือนในปีที่กำหนด สิ่งนี้มีประโยชน์หากระบุวันที่ เช่น วันพฤหัสบดีที่สามของเดือนพฤษภาคม เป็นต้น
dateconv ยังสามารถใช้เพื่อแปลงวันที่ เวลา หรือวันที่-เวลาที่เกิดขึ้นในสตรีมอินพุตได้ทันที
$ dateconv -S -i '%b/%d %Y at %I:%M %P' <<EOF Remember we meet on Mar/03 2012 at 02:30 pm EOF => Remember we meet on 2012-03-03T14:30:00
และที่โดดเด่นที่สุดในการแปลงระหว่างเขตเวลา:
$ dateconv --from-zone "America/Chicago" --zone "Asia/Tokyo" 2012-01-04T09:33:00 => 2012-01-05T00:33:00 $ dateconv --zone "America/Chicago" now -f "%d %b %Y %T" => 05 Apr 2012 11:11:57
เครื่องมือสำหรับการเปรียบเทียบวันที่ในเชลล์ มันถูกสร้างแบบจำลองหลัง test(1)
แต่มีตัวเลือกบรรทัดคำสั่งที่เหมาะสม
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
เครื่องมือในการคำนวณวันที่ (คณิตศาสตร์วันที่) ในเชลล์ เมื่อระบุวันที่และรายการระยะเวลา ระบบจะคำนวณวันที่ใหม่ เมื่อระบุระยะเวลาและรายการวันที่ ระบบจะคำนวณวันที่ใหม่
$ dateadd 2010-02-02 +4d => 2010-02-06 $ dateadd 2010-02-02 +1w => 2010-02-09 $ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF => 2001-01-04 2000-12-31
การเพิ่มระยะเวลาเป็นครั้ง:
$ dateadd 12:05:00 +10m => 12:15:00
และแม้แต่วันที่-เวลา:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
หากได้รับการสนับสนุนโดยการคำนวณที่ปรับเปลี่ยนวินาทีกระโดดของฐานข้อมูลโซนข้อมูลของระบบก็สามารถทำได้ ใช้หน่วย rs
เพื่อแสดงถึงวินาที "จริง":
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
ตรงข้ามกับ:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
เครื่องมือในการคำนวณความแตกต่างระหว่างวันที่สองวัน (หรือมากกว่า) นี่เป็นบทสนทนาของพ่อบ้าง ผลลัพธ์จะเป็นระยะเวลาที่เมื่อเพิ่มเข้ากับวันแรกแล้ว ให้ระบุวันที่ที่สอง
รับจำนวนวันระหว่างวันที่สอง:
$ datediff 2001-02-08 2001-03-02 => 22
สามารถควบคุมรูปแบบระยะเวลาได้โดยใช้สวิตช์ -f
:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
datediff ยังยอมรับการประทับเวลาเป็นอินพุต:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
สวิตช์ -f
ทำสิ่งที่ถูกต้อง:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
เปรียบเทียบกับ:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
หากรองรับโดยฐานข้อมูล Zoneinfo ที่ปรับเปลี่ยนวินาทีกระโดดของระบบ ก็สามารถคำนวณได้ ใช้ตัวระบุรูปแบบ %rS
เพื่อรับเวลาที่ผ่านไปในหน่วยวินาที "จริง":
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
เครื่องมือในการแยกบรรทัดจากอินพุตสตรีมที่ตรงกับเกณฑ์ที่กำหนด โดยแสดงบรรทัดหรือรายการที่ตรงกัน:
$ dategrep '<2012-03-01' <<EOF Feb 2012-02-28 Feb 2012-02-29 leap day Mar 2012-03-01 Mar 2012-03-02 EOF => Feb 2012-02-28 Feb 2012-02-29 leap day
เครื่องมือในการ "ปัดเศษ" วันที่หรือการประทับเวลาเป็นจุดที่เกิดซ้ำ เช่น มกราคมถัดไป/ก่อนหน้า หรือวันพฤหัสบดีถัดไป/ก่อนหน้า
ปัดเศษ (ถอยหลัง) สู่วันแรกของเดือนปัจจุบัน:
$ dateround '2011-08-22' -1 => 2011-08-01
ค้นหาวันจันทร์ถัดไปจากวันที่ปัจจุบัน (วันนี้คือ 2016-01-08):
$ dateround today Mon => 2015-01-11
ย้อนกลับไปเมื่อเดือนกันยายนปีที่แล้ว แล้วปัดไปที่ปลายเดือน:
$ dateround today -- -Sep +31d => 2015-09-30
ปัดเศษวันที่อย่างเคร่งครัดเป็นเดือนแรกของเดือนถัดไป:
$ dateround -S -n 1 <<EOF pay cable 2012-02-28 pay gas 2012-02-29 pay rent 2012-03-01 redeem loan 2012-03-02 EOF => pay cable 2012-03-01 pay gas 2012-03-01 pay rent 2012-04-01 redeem loan 2012-04-01
ปัดอนุกรมเวลาเป็นนาทีถัดไป (เช่น ส่วนวินาทีคือ 00) จากนั้นเป็นเวลาครึ่งนาทีถัดไป (และแปลงเป็น ISO):
$ dateround -S 0s30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:30:00 eventB
หรืออีกทางหนึ่ง หากคุณแบ่งวันออกเป็นครึ่งชั่วโมง คุณสามารถปัดเศษให้เป็นค่าใดค่าหนึ่งโดยใช้เครื่องหมายร่วมคลาสได้:
$ dateround -S /30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:00:00 eventB
สิ่งนี้จะเหมือนกับตัวอย่างก่อนหน้านี้เป็นส่วนใหญ่ ยกเว้นว่าชั่วโมงเต็ม (เป็นผลคูณของครึ่งชั่วโมงเลขคู่) เป็นเป้าหมายการปัดเศษที่เป็นไปได้
เครื่องมือสำหรับนำบรรทัดของไฟล์มาเรียงตามลำดับเวลา
ในขณะนี้ เครื่องมือ datesort
ขึ้นอยู่กับ sort(1)
โดยรองรับฟิลด์ต่างๆ โดยเฉพาะอย่างยิ่ง -t
เพื่อเลือกตัวคั่น และ -k
เพื่อจัดเรียงตามฟิลด์เฉพาะ
$ datesort <<EOF 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" EOF => 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53"
เครื่องมือสำหรับตรวจสอบค่าวันที่/เวลาในเขตเวลาต่างๆ อย่างรวดเร็ว ผลลัพธ์จะเป็นเมทริกซ์ที่แสดงทุกค่าวันที่-เวลาในทุกเขตเวลา:
$ datezone Europe/Berlin Australia/Sydney now 2014-06-30T05:00:00 => 2014-01-30T17:37:13+01:00 Europe/Berlin 2014-01-31T03:37:13+11:00 Australia/Sydney 2014-06-30T07:00:00+02:00 Europe/Berlin 2014-06-30T15:00:00+10:00 Australia/Sydney
เครื่องมือ datezone
ยังสามารถใช้เพื่อรับการเปลี่ยนแปลง DST ถัดไปหรือก่อนหน้าโดยสัมพันธ์กับวันที่/เวลาที่กำหนด:
$ datezone --next Europe/Berlin Australia/Sydney 2013-02-19 => 2013-03-31T02:00:00+01:00 -> 2013-03-31T03:00:00+02:00 Europe/Berlin 2013-04-07T03:00:00+11:00 -> 2013-04-07T02:00:00+10:00 Australia/Sydney
โดยที่การประทับเวลาด้านซ้ายหมายถึงออฟเซ็ตโซนปัจจุบัน และด้านขวาคือออฟเซ็ตโซนหลังจากการเปลี่ยนแปลง วันที่/เวลาระบุช่วงเวลาที่แน่นอนว่าการเปลี่ยนแปลงจะเกิดขึ้น
ในสาระสำคัญ datezone
จะดีกว่า zdump(8)
เครื่องมือที่นำความยืดหยุ่นของ strptime(3)
มาสู่บรรทัดคำสั่ง ในขณะที่ (อย่างน้อย GNU) date(1)
มีการรองรับรูปแบบเอาต์พุต แต่ก็ขาดการสนับสนุนใด ๆ ในการอ่านอินพุตที่กำหนดเองจากโดเมนของวันที่ โดยเฉพาะอย่างยิ่งเมื่อทราบรูปแบบอินพุตล่วงหน้าโดยเฉพาะและจะต้องเฉพาะวันที่ / เวลาที่ตรงกันเท่านั้น ที่พิจารณา.
ด้วยเครื่องมือ strptime
ที่อ่านวันที่แปลกๆ เช่น Mon, May-01/2000
จึงกลายเป็นประเด็นสำคัญ
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
เช่นเดียวกับที่คุณทำใน C.
โปรดทราบว่าจริงๆ แล้ว strptime
ใช้รูทีน strptime ของระบบ libc และสำหรับเอาต์พุตรูทีน strftime ของระบบ ตัวดัดแปลงอินพุตและเอาต์พุตจะแตกต่างกันไปในแต่ละระบบ
สำหรับการรวมพาร์เซอร์/เครื่องพิมพ์แบบพกพา ให้ใช้ dateconv
ตามที่อธิบายไว้ข้างต้น ตัวระบุรูปแบบอินพุตและเอาต์พุตไม่ขึ้นอยู่กับรันไทม์ C
โดยไม่มีคำสั่งใดเป็นพิเศษและไม่มีการอ้างสิทธิ์ในความครบถ้วนสมบูรณ์:
dateexpr: http://www.eskimo.com/~scs/src/#dateexpr
dateutils ของ allanfalloon: https://github.com/alanfalloon/dateutils
ใช่ http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
ใช้อันที่เหมาะกับวัตถุประสงค์ของคุณมากที่สุด และในกรณีที่คุณชอบของฉัน ให้โหวต: หน้า openhub ของ dateutils