2016-05-11 37 views
-1

當運行與GNU日期下面的命令:GNU日期命令不允許很遠的年份?

date -d "20145-01-23" 

我得到以下結果:

日期:無效日期`20145-01-23'

然而,the manual當年可以是任何數字:

對於數字月份,在ISO 8601格式的「年 - 月 - 日」是允許的,其中year是任意正數[...]

因此,有兩個問題:

  • 這是一個錯誤?還是我誤解了一些東西?
  • 如何獲得與BSD日期相同的行爲,它接受此日期作爲有效日期?
+0

適用於我:'date --version'表示日期(GNU coreutils)8.21,並且您的命令顯示LC_ALL = C,POSIX和en_US.utf8爲'Sat Jan 23 00:00:00 PST 20145'。 –

+0

哇,這太瘋狂了!對於我'日期 - 版本說'日期(GNU coreutils)8.5「,它仍然告訴我無效的日期消息。我不知道該怎麼想 –

+0

想一想:它可以是一個瘋狂的區域格式,例如日期假定'23'爲月?嘗試'LC_ALL = C日期-d「20145-01-23」'。 –

回答

3

這個工作對我來說,使用GNU的coreutils 8.24:

$ date -d "20145-01-23" 
Sat Jan 23 00:00:00 PST 20145 

我不能肯定這種解釋(UPDATE:看起來像我的猜測是正確的),但我的猜測是您使用的是32位time_t而不是64位的系統。使用32位時,唯一可表示的日期是從週五的1901-12-13 20:45:52 UTC(2 秒)到20:00-01-19 03:14:07 UTC(2 在紀元後-1秒)。

如果是這樣的話,那麼這個命令應該成功:

$ date -d 2037-01-01 
Thu Jan 1 00:00:00 PST 2037 

,這應該失敗:

(我已經重建的結果應該是什麼樣子的,去年命令。第一個的輸出將根據您的時區而略有不同。)

如何獲得與BS相同的行爲D日期,它接受這是一個有效日期?

你是說你想 BSD約會拒絕嗎?如果是(更多推測),則運行32位版本的BSD,或測試請求的時間是否在32位時間戳範圍之外。

+0

你釘了它!印象深刻!不知道你是如何設法想到這個的! –

+0

@VicSeedoubleyew:我已經在大量的32位和64位系統上工作過,並且我知道2038年2月以來,它是一個有符號的32位整數,代表自1970年以來秒數的最大值。谷歌搜索「2038」會帶來很多討論結果。 –

+0

古代的日期應該注意一點:在公曆之前只有朱利安,所以平日的名字是錯誤的。例如:'date -d「0001-01-23」'打印1月23日星期二00:00:00 CET 0001',但這是「假」格里高利。在朱利安日曆中,那麼實際上那個日期是在星期天下降的;見:http://fourmilab.ch/documents/calendar/#juliancalendar ...我一直試圖找到一個命令行日期程序來處理古代日期,尊重從公曆到朱利安,這也延伸到BCE。找不到任何東西。 – JayB

0

BSD date -d需要一個時區值。爲了抵消年,日或其他任何事情,您通過-v NT,其中N是數字,T是表示日,月或年的字符。

標誌不同。對於GNU版本,請參閱http://www.unix.com/man-page/All/1/date/,對於常見的BSD版本,請參閱http://www.unix.com/man-page/FreeBSD/1/date/

+0

總是有助於記住GNU實際代表的是什麼; ** G ** NU's ** N ** ot ** U ** nix。 BSD *是*。 – Ryder

+0

我知道這些標誌不同。我的意思是,BSD日期不會拒絕20145-01-23作爲有效日期 –

+0

從上述內容中,您使用BSD日期得到的輸出是什麼? – Ryder