152

是否有一种快速、单行的方法可以从 Unix 命令行将 Unix 时间戳转换为日期?

date可能有效,除了指定每个元素(月、日、年、小时等)相当尴尬,而且我不知道如何让它正常工作。似乎有一种更简单的方法——我错过了什么吗?

4

11 回答 11

218

使用GNU coreutilsdate,您可以:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(来自:BASH:将 Unix 时间戳转换为日期

在 OS X 上,使用date -r.

date -r "$TIMESTAMP"

或者,使用strftime(). 它不能直接从 shell 获得,但您可以通过gawk访问它。说明%c符以与语言环境相关的方式显示时间戳。

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
于 2010-07-14T19:54:34.643 回答
77

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' 其中后面@的数字是以秒为单位的数字

于 2010-07-14T20:01:52.657 回答
26

此解决方案适用于不支持的日期版本date -d @。它不需要AWK或其他命令。Unix 时间戳是自 1970 年 1 月 1 日 UTC 以来的秒数,因此指定 UTC 很重要。

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

如果您使用的是 Mac,请使用:

date -r 1357004952

获取纪元的命令:

date +%s
1357004952

归功于Anton:BASH:将 Unix 时间戳转换为日期

于 2013-01-01T01:53:37.210 回答
11

正如@TomMcKenzie 在对另一个答案的评论中所说,date -r 123456789可以说是一个更常见(即更广泛实施)的简单解决方案,自 Unix 纪元以来以秒为单位给出的时间,但不幸的是,没有通用的保证可移植解决方案。

许多类型系统上的选项意味着与 GNU Date 的扩展-d完全不同的东西。--date遗憾的是,GNU Date 的解释-r与这些其他实现不同。所以不幸的是,你必须知道date你使用的是哪个版本,而且许多旧的 Unixdate命令不支持任何一个选项。

更糟糕的是,POSIXdate既不承认-d也不-r在任何命令(据我所知)中提供从命令行格式化 Unix 时间的标准方法(因为 POSIX Awk 也缺少strftime())。(你不能使用touch -tandls因为前者不接受自 Unix 纪元以来的秒数。)

请注意,尽管 Brian Kernighan 直接提供的 The One True Awk 现在确实具有strftime()内置systime()函数以及返回自 Unix 纪元以来的当前时间(以秒为单位)的函数,因此 Awk 解决方案可能是最便携的。

于 2013-01-01T03:24:23.853 回答
4

如果你觉得这个符号很尴尬,也许-R-option 确实有帮助。它以 RFC 2822 格式输出日期。所以你不需要所有这些标识符:date -d @1278999698 -R. 另一种可能性是在您的语言环境中以秒为单位输出日期:date -d @1278999698 +%c. 应该很容易记住。:-)

于 2010-07-14T20:06:47.440 回答
2

标准的 Perl 解决方案是:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(或本地时间,如果愿意)

于 2012-11-06T18:50:15.473 回答
2

对上面 dabest1 的回答稍作修正。将时区指定为 UTC,而不是 GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

第二个是正确的。我认为原因是在英国,夏令时从 1968 年到 1971 年一直有效。

于 2014-11-18T10:45:30.580 回答
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
于 2010-07-14T19:51:34.250 回答
1

这里的其他例子很难记住。最简单的:

date -r 1305712800
于 2015-06-30T22:02:24.547 回答
1

将以下内容放入您的 ~/.bashrc :

function unixts() { date -d "@$1"; }

示例用法:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
于 2019-02-27T14:18:04.013 回答
0

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
于 2020-03-16T20:08:12.783 回答