Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将Unix时间戳转换为日期字符串_Bash_Shell_Unix_Unix Timestamp - Fatal编程技术网

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

Bash 将Unix时间戳转换为日期字符串,bash,shell,unix,unix-timestamp,Bash,Shell,Unix,Unix Timestamp,是否有一种快速、一行的方法可以从Unix命令行将Unix时间戳转换为日期 date可能会起作用,但要指定每个元素(月、日、年、小时等)相当麻烦,而且我也不知道如何让它正常工作。似乎有更简单的方法 — 我遗漏了什么吗?有了GNU的日期你可以: awk 'BEGIN { print strftime("%c", 1271603087); }' date -d "@$TIMESTAMP" (发件人:) 在OSX上,使用date-r date -r "$TIMESTAMP" 或者,使用strfti

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


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

有了GNU的
日期
你可以:

awk 'BEGIN { print strftime("%c", 1271603087); }'
date -d "@$TIMESTAMP"
(发件人:)

在OSX上,使用
date-r

date -r "$TIMESTAMP"
或者,使用
strftime()
。它不能直接从shell获得,但您可以通过访问它。
%c
说明符以区域设置相关的方式显示时间戳

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'

date-d@1278999698+%Y-%m-%d%H:%m:%S'

如果
@
后面的数字是以秒为单位的数字

如果您觉得这种表示法不合适,那么
-R
-选项可能会有所帮助。它以RFC2822格式输出日期。因此,您不需要所有这些标识符:
date-d@1278999698-R
。另一种可能是在您的区域设置中以秒为单位输出日期:
date-d@1278999698+%c
。应易于记忆。:-)

标准的Perl解决方案是:

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

(或本地时间,如果首选)

此解决方案适用于不支持
date-d@
的日期版本。它不需要任何命令或其他命令。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

安东:正如@TomMcKenzie在对另一个答案的评论中所说,
date-r 123456789
可以说是自Unix时代以来以秒为单位的更常见(即实现更广泛)的简单解决方案,但不幸的是,没有通用的可移植解决方案

许多类型的系统上的
-d
选项意味着与GNU Date的
-Date
扩展完全不同的内容。遗憾的是,GNU Date对
-r
的解释与其他实现不同。因此,不幸的是,您必须知道您使用的是哪个版本的
date
,而且许多旧的Unix
date
命令都不支持这两个选项

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


请注意,尽管Brian Kernighan直接提供的一个真正的Awk现在已经内置了
strftime()
函数以及
systime()
函数来返回Unix时代以来的当前时间(以秒为单位),但Awk解决方案可能是最具可移植性的。

对上面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年一直有效。

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

date -r 1305712800

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

function unixts() { date -d "@$1"; }
用法示例:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
Python:

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

在OSX 10.8上,它是
date-r 1278999698+'%Y-%m-%d%H:%m:%s'
(GMT)或简单地
date-r 1278999698
适用于Ubuntu 16.04可能的重复,请确保从时间戳中删除毫秒(即仅为10位,而不是13位),否则您将得到无效的结果(对于macOS的日期是如此).我以为这不起作用,直到我意识到我有一个毫秒的时间戳。切掉最后3位数字,你会得到准确的时间混合结果:在ubuntu Linux中不起作用,但在Mac OS X中起作用。
$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"