我需要像date这样简单的东西,但从1970年开始以秒为单位,而不是当前的日期、小时、分钟和秒。date似乎没有提供这个选项。有简单的方法吗?
date
gywdnpxw1#
这应该可以工作:
date +%s
正如最近在date manual中更正的那样:%s =自纪元(1970-01-01 00:00 UTC)以来的秒数
pkmbmrz72#
补充一下获取任何给定日期(例如1973年10月21日)自纪元(1970年1月1日)以来的秒数。
date -d "Oct 21 1973" +%s
将秒数转换回日期
date --date @120024000
命令date是非常通用的。你可以用date做的另一件很酷的事情(无耻地复制自date --help)。显示美国西海岸下周五上午9点的当地时间
date --help
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
更好的方法是花些时间阅读手册页http://man7.org/linux/man-pages/man1/date.1.html
hk8txs483#
从bash 5.0(released on 7 Jan 2019)开始,您可以使用内置变量EPOCHSECONDS。
bash
EPOCHSECONDS
$ echo $EPOCHSECONDS 1547624774
还有EPOCHREALTIME,它包括秒的分数。
EPOCHREALTIME
$ echo $EPOCHREALTIME 1547624774.371210
EPOCHREALTIME可以通过去掉小数点来转换为微秒(μs)。当使用bash的内置算术(( expression ))时,这可能会很有趣,因为bash只能处理整数。
(( expression ))
$ echo ${EPOCHREALTIME/./} 1547624774371210
在上面的所有示例中,为了更好的可读性,打印的时间值都是相等的。实际上,时间值会有所不同,因为每个命令执行的时间很短。
tzcvj98z4#
到目前为止,所有的答案都使用外部程序date。从Bash 4.2开始,printf有一个新的修饰符%(dateformat)T,当与参数-1一起使用时,输出当前日期,格式由dateformat给定,由strftime(3)处理(man 3 strftime用于格式信息)。因此,对于纯Bash解决方案:
printf
%(dateformat)T
-1
dateformat
strftime(3)
man 3 strftime
printf '%(%s)T\n' -1
或者如果你需要将结果存储在变量var中:
var
printf -v var '%(%s)T' -1
没有外部程序和子shell!从Bash 4.3开始,甚至可以不指定-1:
printf -v var '%(%s)T'
(but尽管如此,始终给予参数-1可能更明智)。如果使用-2作为参数而不是-1,Bash将使用shell启动的时间而不是当前日期。
-2
$ printf -v beg '%(%s)T\n' -2 $ printf -v now '%(%s)T\n' -1 $ echo beg=$beg now=$now elapsed=$((now-beg)) beg=1583949610 now=1583953032 elapsed=3422
kkih6yb85#
对于大多数Awk实现:
awk 'BEGIN {srand(); print srand()}'
9gm1akwq6#
这是对@pellucide所做的事情的扩展,但对于Mac:确定任何给定日期(例如1973年10月21日)自纪元(1970年1月1日)以来的秒数
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s" 120034800
请注意,为了完整起见,我已经在格式中添加了时间部分。原因是date将接受您提供的任何日期部分,并将 * 当前 * 时间添加到提供的值中。例如,如果您在4:19 PM执行上述命令,而没有'00:00:00'部分,它将自动添加时间。这样“Oct 21 1973”将被解析为“Oct 21 1973 16:19:00”。这可能不是您想要的。要将时间戳转换回日期,请执行以下操作:
$ date -j -r 120034800 Sun Oct 21 00:00:00 PDT 1973
Apple的日期实现手册页:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
iszxjhcz7#
使用这个bash脚本(我的~/bin/epoch):
~/bin/epoch
#!/bin/bash # get seconds since epoch test "x$1" == x && date +%s && exit 0 # or convert epoch seconds to date format (see "man date" for options) EPOCH="$1" shift date -d @"$EPOCH" "$@"
7条答案
按热度按时间gywdnpxw1#
这应该可以工作:
正如最近在date manual中更正的那样:
%s =自纪元(1970-01-01 00:00 UTC)以来的秒数
pkmbmrz72#
补充一下
获取任何给定日期(例如1973年10月21日)自纪元(1970年1月1日)以来的秒数。
将秒数转换回日期
命令
date
是非常通用的。你可以用date做的另一件很酷的事情(无耻地复制自date --help
)。显示美国西海岸下周五上午9点的当地时间更好的方法是花些时间阅读手册页http://man7.org/linux/man-pages/man1/date.1.html
hk8txs483#
纯bash解决方案
从
bash
5.0(released on 7 Jan 2019)开始,您可以使用内置变量EPOCHSECONDS
。还有
EPOCHREALTIME
,它包括秒的分数。EPOCHREALTIME
可以通过去掉小数点来转换为微秒(μs)。当使用bash
的内置算术(( expression ))
时,这可能会很有趣,因为bash
只能处理整数。在上面的所有示例中,为了更好的可读性,打印的时间值都是相等的。实际上,时间值会有所不同,因为每个命令执行的时间很短。
tzcvj98z4#
到目前为止,所有的答案都使用外部程序
date
。从Bash 4.2开始,
printf
有一个新的修饰符%(dateformat)T
,当与参数-1
一起使用时,输出当前日期,格式由dateformat
给定,由strftime(3)
处理(man 3 strftime
用于格式信息)。因此,对于纯Bash解决方案:
或者如果你需要将结果存储在变量
var
中:没有外部程序和子shell!
从Bash 4.3开始,甚至可以不指定
-1
:(but尽管如此,始终给予参数
-1
可能更明智)。如果使用
-2
作为参数而不是-1
,Bash将使用shell启动的时间而不是当前日期。kkih6yb85#
对于大多数Awk实现:
9gm1akwq6#
这是对@pellucide所做的事情的扩展,但对于Mac:
确定任何给定日期(例如1973年10月21日)自纪元(1970年1月1日)以来的秒数
请注意,为了完整起见,我已经在格式中添加了时间部分。原因是
date
将接受您提供的任何日期部分,并将 * 当前 * 时间添加到提供的值中。例如,如果您在4:19 PM执行上述命令,而没有'00:00:00'部分,它将自动添加时间。这样“Oct 21 1973”将被解析为“Oct 21 1973 16:19:00”。这可能不是您想要的。要将时间戳转换回日期,请执行以下操作:
Apple的日期实现手册页:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
iszxjhcz7#
使用这个bash脚本(我的
~/bin/epoch
):