将 Unix 时间戳转换为日期字符串

Posted

技术标签:

【中文标题】将 Unix 时间戳转换为日期字符串【英文标题】:Convert Unix timestamp to a date string 【发布时间】:2011-03-16 01:22:06 【问题描述】:

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

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

【问题讨论】:

How to convert timestamps to dates in bash?的可能重复 【参考方案1】:

使用 GNU 的 date,您可以:

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

(来自:BASH: Convert Unix Timestamp to a Date)

在 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

【讨论】:

确保从时间戳中消除毫秒(即只有 10 位而不是 13 位),否则您将得到无效的结果(对于 macOS 的日期是这样)。 我认为这不起作用,直到我意识到我有一个以毫秒为单位的时间戳。去掉最后3位,你就得到准确的时间【参考方案2】:

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

【讨论】:

在 OSX 10.8 上,它是 date -r 1278999698 +'%Y-%m-%d %H:%M:%S' (GMT) 或只是 date -r 1278999698 适用于 Ubuntu 16.04【参考方案3】:

此解决方案适用于不支持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: Convert Unix Timestamp to a Date

【讨论】:

【参考方案4】:

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

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

更糟糕的是,POSIX date 既不识别 -d 也不识别 -r 并且根本没有在任何命令(据我所知)中提供从命令行格式化 Unix 时间的标准方法(因为 POSIX Awk 也缺乏strftime())。 (您不能使用 touch -tls,因为前者不接受自 Unix 纪元以来的秒数。)

请注意,虽然可以直接从 Brian Kernighan 获得的 The One True Awk 现在确实具有内置的 strftime() 函数以及 systime() 函数以返回自 Unix 纪元以来的当前时间(以秒为单位),所以也许 Awk解决方案是最便携的。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

对上面 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 年,夏令时一直在实施。

【讨论】:

【参考方案7】:

标准的 Perl 解决方案是:

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

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

【讨论】:

【参考方案8】:
awk 'BEGIN  print strftime("%c", 1271603087); '

【讨论】:

【参考方案9】:

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

date -r 1305712800

【讨论】:

混合结果:在 ubuntu Linux 中不起作用,但在 Mac OS X 中起作用。【参考方案10】:

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

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

示例用法:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

【讨论】:

【参考方案11】:

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"

【讨论】:

以上是关于将 Unix 时间戳转换为日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

将长的 Unix 纪元时间戳转换为实际日期/时间

ActionScript 3 将日期转换为unix时间戳字符串

使用 sql 将字符串纪元代码从 unix 时间戳转换为日期

Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为日期时间

php怎么将指定日期转换为时间戳?

php怎么将指定日期转换为时间戳