Dateutils 是一組圍繞在命令列上處理日期和時間的工具,重點在於處理大量財務資料時出現的用例。
Dateutils 主要託管在 github 上:
github頁面:https://github.com/hroptatyr/dateutils
專案首頁:http://www.fresse.org/dateutils/
下載:https://bitbucket.org/hroptatyr/dateutils/downloads
下面是一個簡短的範例列表,示範了 dateutils 的功能,有關完整規範,請參閱資訊和手冊頁。 有關安裝說明,請參閱安裝檔。
Dateutils 指令以date
為前綴,但出於直覺原因,其他方麵類似於已知的 UNIX 指令。 唯一的例外是strptime
,它類似於同名的 libc 函數。
strptime
C 函數的命令列版本
dateadd
將持續時間新增至日期或時間
dateconv
在日曆之間轉換日期或時間
datediff
計算日期或時間之間的持續時間
dategrep
Grep 輸入流中的日期或時間
dateround
將日期或時間捨去為「更完整」的值
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
另一個好處是可以直接給出結束日期,而不是根據開始日期和天數間隔計算。 此外,它還提供了特定於日期的功能,這些功能將成為使用上述 seq(1)/date(1) 方法實現的 PITA,例如跳過某些工作日:
$ 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
dateeq 也適用於時間:
$ 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
個月的%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
一個在 shell 中執行日期比較的工具,它是在test(1)
之後建模的,但具有適當的命令列選項。
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
在 shell 中執行日期算術(date maths)的工具。 給定一個日期和一個持續時間列表,這將計算新的日期。 給定持續時間和日期列表,這將計算新日期。
$ 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
如果系統的 zoneinfo 資料庫支持,則可以進行閏秒調整計算。 使用單位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
或者,如果您將一天分為半小時,您可以使用 co-class 表示法四捨五入到其中一個:
$ 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
實際上使用系統 libc 的 strptime 例程,並使用系統的 strftime 例程進行輸出。 因此,輸入和輸出修飾符在系統之間會有所不同。
對於可攜式解析器/印表機組合,請如上所述使用dateconv
。 其輸入和輸出格式說明符獨立於 C 運行時。
排名不分先後,也不保證完整性:
日期表達式:http://www.eskimo.com/~scs/src/#dateexpr
allanfalloon 的 dateutils:https://github.com/alanfalloon/dateutils
是的http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
使用最適合您目的的一種。 如果你碰巧喜歡我的,請投票:dateutils' openhub 頁面