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

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

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

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

内置:strftimezsh

$ 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

相关内容