我已经看到,为了将纪元转换为日期时间,可以执行以下操作:
date -d @1346338800 +'%Y%m%d%H%M%S'
我怎样才能在 Linux 中做相反的事情? IE 将 20191027163020 转换为纪元值?是否可以不使用 Python 或其他编程语言脚本来完成?
答案1
Linux
只是一个内核,与 Q&A 无关。
通过 busybox 实现date
(GNUdate
也在考虑实施类似的选项; GNU 和 busyboxdate
是使用 Linux 作为内核的系统上常见的两种实现,我知道它们支持您的date -d @xxx
语法)。
$ date -D %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
使用 ast-open 实现date
(就像date
作为 ast-open 的一部分构建时的内置 ksh93 一样):
$ date -p %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
内置:strftime
zsh
$ zmodload zsh/datetime
$ strftime -r %Y%m%d%H%M%S 20191027163020
1572193820
使用当前版本的 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
请注意,它们都按当地时间工作。由于时区偏移量未包含在您的格式中,因此它不明确。
例如,在英国大陆,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
您可能希望始终使用 UTC 时间来避免此类问题(例如,通过将$TZ
环境变量设置为)。UTC0
答案2
一般来说,日期命令(具有-d
选项的实现)可以从一些ISO8601 格式的日期字符串为纪元数。
$ date -d '2019-10-27 16:30:20'
Sun 27 Oct 2019 04:30:20 PM EDT
$ busybox date -d '2019-10-27 16:30:20' +%s
1572208220
但如果您想要通用格式的答案,则需要声明写入日期字符串的特定格式。这可以通过-f
选项*BSD date
(无 -d 选项)、-D
选项busybox date
、ast-open 选项-p
或 ksh93 中的变量 DATEMSK来完成。
date -j -f %Y%m%d%H%M%S 20191027163020 +%s # *BSD
busybox date -D %Y%m%d%H%M%S -d 20191027163020 +%s # busybox
date -p %Y%m%d%H%M%S -d 20191027163020 +%s # ast-open
DATEMSK=/dev/fd/3 3<<<%Y%m%d%H%M%S printf "%(%s)T\n" 20191027163020 # ksh93
在 GNU date 中,您需要手动进行格式化:
$ t=20191027163020
$ T=$(echo "$t" | sed -E 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3T\4:\5:\6/')
$ echo "$T"
2019-10-27T16:30:20
$ date -d "$T" +%s
1572208220