我正在阅读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