我正在閱讀GNU coreutils 手冊,我正在嘗試該 date
命令。這是我在文中發現的:
該
date
指令有一個選項:-f datefile
- 解析每一行日期文件與 一樣
-d
並顯示結果日期和時間。 - 這意味著
date
正在查看中的每一行日期文件 並將其視為用於顯示特定日期的日期字串。
- 解析每一行日期文件與 一樣
在第29章(日期輸入格式),指出:
命令的輸出
date
並不總是可以接受作為日期字串,不僅因為語言問題,還因為像「IST」這樣的時區項目沒有標準意義。 當用於date
產生打算稍後解析的日期字串時,指定獨立於語言且不使用“UTC”和“Z”以外的時區項目的日期格式。以下是一些方法:$ LC_ALL=C TZ=UTC0 date ︙
- 這個陳述(尤其是粗體部分)對我來說意味著我應該能夠將 日期文件
date
諸如上面的命令,以及 我date
在終端機中發出的命令應該能夠解析該date
命令日期文件 並輸出對應的日期。
- 這個陳述(尤其是粗體部分)對我來說意味著我應該能夠將 日期文件
它對我不起作用。日期文件中的日期命令有問題(錯誤的引號,一些我不知道的特殊語法...),或者該-f datefile
選項無法處理這種情況。
總而言之,我要問的是:
- 該
date -f
命令是否可以輸入一個文件,其中一行上的日期字串是另一個日期命令?例如,我可以在文件的第一行添加一個字串“date”(作為命令,將返回系統時間),然後將該文件輸入到命令中date -f
並獲取當前系統時間(由date
命令生成)在文件中)?
答案1
GNU 日期正確解析的日期時間的正確格式是:
$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000
這也避免了可能產生其他問題的空間。
如果您的文件每個日期包含一行,例如:
$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000
然後這將起作用:
$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016
如果您想要做的是建立一個包含「日期命令」的文件,如下所示:
$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"
然後您需要使用 shell 執行每一行。
一種快速解決方案是獲取檔案並執行所有命令。
$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016
這回答了你的問題了嗎?
答案2
從date
coreutils 8.21 開始,TZ=UTC 和 LC_ALL=CI 得到
$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$
正如預期的那樣。我也檢查了原始程式碼:神奇的事情發生在例程中batch_convert
,本質上有一個parse_datetime()
/循環show_date()
,就像命令列情況一樣(使用-d
)。
答案3
不,您無法讀取LC_ALL=C TZ=UTC0
帶有date -f
.
cat tz
LC_ALL=C TZ=UTC0
date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”
但是,您可以將整個命令放入一個文件中,如下所示:
cat date
#!/bin/bash
LC_ALL=C TZ=UTC0 date
然後從命令列運行它,這將為您提供:
./date
Tue Sep 27 06:56:29 UTC 2016
與我伺服器上的時區相反:
date
tis 27 sep 2016 08:56:52 CEST