如何将日期时间转换为纪元?

M.E*_*.E. 5 command-line date

我已经看到,为了将纪元转换为日期时间,可以执行以下操作:

date -d  @1346338800 +'%Y%m%d%H%M%S'
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Linux 中做相反的事情?IE 将 20191027163020 转换为纪元值?是否可以不使用 Python 或其他编程语言脚本来完成?

Sté*_*las 4

Linux只是一个内核,与 Q&A 无关。

通过 busybox 实现dateGNUdate也在考虑实现类似的选项;GNU 和 busyboxdate是在使用 Linux 作为内核的系统上常见的两种实现,我知道它们支持您的date -d @xxx语法)。

$ date -D %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
Run Code Online (Sandbox Code Playgroud)

使用 ast-open 实现date(就像date作为 ast-open 的一部分构建时的内置 ksh93 一样):

$ date -p %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
Run Code Online (Sandbox Code Playgroud)

内置:strftimezsh

$ zmodload zsh/datetime
$ strftime -r %Y%m%d%H%M%S 20191027163020
1572193820
Run Code Online (Sandbox Code Playgroud)

使用当前版本的 GNU date,您可以将其转换为其-d/支持的格式-f(例如2019-10-27T16:30:20):

t=20191027163020
printf '%s%s-%s-%sT%s:%s:%s\n' $(printf '%s\n' "$t" | fold -w2) |
  date -f - +%s
Run Code Online (Sandbox Code Playgroud)

请注意,它们都按当地时间工作。由于时区偏移量未包含在您的格式中,因此它不明确。

例如,在英国大陆,20191027011200 可能是 1572138720 或 1572135120,因为切换到冬季时间后,时钟会显示 01:12:00 两次,间隔一小时。

$ date -d @1572138720 +%Y%m%d%H%M%S
20191027011200
$ date -d @1572135120 +%Y%m%d%H%M%S
20191027011200
Run Code Online (Sandbox Code Playgroud)

您可能希望始终使用 UTC 时间来避免此类问题(例如,通过将$TZ环境变量设置为)。UTC0