如何在 Bash 中以毫秒为单位获取当前的 Unix 时间?

Ric*_*ard 314 unix bash time

如何获得以毫秒为单位的当前 Unix 时间(即自 Unix 纪元 1970 年 1 月 1 日以来的毫秒数)?

war*_*ren 368

这个:

date +%s 
Run Code Online (Sandbox Code Playgroud)

将返回自纪元以来的秒数

这个:

date +%s%N
Run Code Online (Sandbox Code Playgroud)

返回秒和当前纳秒。

所以:

date +%s%N | cut -b1-13
Run Code Online (Sandbox Code Playgroud)

会给你自纪元以来的毫秒数 - 当前秒加上左三纳秒。


和来自MikeyB - echo $(($(date +%s%N)/1000000))(除以 1000 只带来微秒)

  • 我想知道切割增加了多少毫秒:-) (51认同)
  • 我认为值得注意的是,该人要求使用 Unix,而不是 Linux,并且当前的最佳答案(日期 +%s%N)在我的 AIX 系统上不起作用。 (29认同)
  • @Pete +1 OS X 和 FreeBSD 相同 (15认同)
  • 或者,如果你想在 shell 中完成这一切,避免额外进程的昂贵开销(实际上,当 %+s+N 中的位数发生变化时,我们正在避免这个问题):`echo $(($(日期 +%s%N)/1000))` (13认同)
  • `%N` 在 OSX Yosemite 上不起作用 (10认同)
  • 这是事情的原则......避免幻数和编码你实际上*意味着*。 (5认同)
  • 我认为秒 * 1000 就可以了 :) (3认同)
  • 在 OS X 上,你最好的选择可能是 brew coreutils,然后你可以`gdate +%s%N` (3认同)
  • @warren Youn 是对的。我指的是评论中的那个。我没有看到答案中的那个... (2认同)
  • 除了使用 `cut -b1-13`,可以使用 bash 子字符串:`dt=$(date +%s%N); ${dt:1:13}`。 (2认同)

Joe*_*Joe 155

您可以简单地使用%3N将纳秒截断为 3 个最高有效数字(然后是毫秒):

$ date +%s%3N
1397392146866
Run Code Online (Sandbox Code Playgroud)

这适用于我的Kubuntu 12.04(精确穿山甲)。

但请注意,%N根据您的目标系统,可能无法实现。例如在嵌入式系统上测试(buildroot rootfs,使用非 HF ARM 交叉工具链编译)没有%N

$ date +%s%3N
1397392146%3N
Run Code Online (Sandbox Code Playgroud)

(而且我的(非根)Android 平板电脑也没有%N。)

  • 这是 GNU coreutils 的一个特性。最终,这是在 gnulib 中实现的:https://github.com/gagern/gnulib/blob/71090a2a314d9c378afd6f842abb49f60b42d4ef/lib/strftime.c#L1085。 (2认同)
  • 这应该是公认的答案。 (2认同)

小智 80

date +%N 不适用于 OS X,但您可以使用其中之一

  • 红宝石ruby -e 'puts Time.now.to_f'
  • 蟒蛇python -c 'import time; print(int(time.time() * 1000))'
  • 节点.jsnode -e 'console.log(Date.now())'
  • PHP :php -r 'echo microtime(TRUE);'
  • 长生不老药DateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • 互联网: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • 或四舍五入到最接近的秒的毫秒数 date +%s000

  • 或者,如果您*实际上不需要毫秒*而只需要正确的格式:`date +%s000` (10认同)
  • 当然,你只需要等待那些口译员热身。这也有效:`wget -qO- http://www.timeapi.org/utc/now?\\s.\\N` (9认同)
  • https://apple.stackexchange.com/questions/135742/time-in-milliseconds-since-epoch-in-the-terminal 有通过 Brew 的 `coreutils` 在 OSX 中执行此操作的说明 (2认同)

小智 19

我的解决方案不是最好的,但对我有用:

date +%s000
Run Code Online (Sandbox Code Playgroud)

我只需要将 2012-05-05 之类的日期转换为毫秒。


小智 11

只是把它扔在那里,但我认为除法的正确公式是:

echo $(($(date +%s%N)/1000000))
Run Code Online (Sandbox Code Playgroud)


小智 10

此解决方案适用于 macOS。

如果您考虑使用 Bash 脚本并且有可用的 Python,则可以使用以下代码:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您正在寻找一种显示脚本运行时间长度的方法,以下将提供(不完全准确)结果:

尽可能靠近脚本的开头,输入以下内容

basetime=$(date +%s%N)

这将为您提供一个类似于 1361802943996000000 的起始值。

在脚本末尾,使用以下内容

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

会显示类似的内容

runtime: 12.383 seconds

笔记:

如果您愿意,可以将 (1*10^09) 替换为 1000000000

"scale=3"这是一个相当罕见的环境,强制bc你做你想做的事。还有很多!

我只在 Windows 7/MinGW 上测试过这个...我手头没有合适的 *nix 盒子。

  • 或者你可以只使用 `time <script>` (3认同)

Cam*_*tin 7

对于建议运行外部程序以获取毫秒数的人......以这种速度,您不妨这样做:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Run Code Online (Sandbox Code Playgroud)

要点是:在从这里选择任何答案之前,请记住,并非所有程序都会在一整秒内运行。措施!

  • @orkoden 该问题明确要求“自 Unix 纪元 1970 年 1 月 1 日以来的毫秒数”。此外,我更多的是指出你不应该仅仅为了获得时间而启动整个 Ruby 或 Python(或 wget)——这是通过快速通道完成的,或者毫秒无关紧要。 (2认同)
  • 是的,我知道您提供了一个更糟糕的解决方案来突出糟糕解决方案的缺陷。我尝试了几种解决方案并测量了时间。http://lpaste.net/119499 结果有点有趣。即使在非常快的 i7 机器上,`date` 也需要 3 毫秒才能运行。 (2认同)
  • @Nakilon,这就是为什么人们不应该依赖可卷曲的便利,就像任何生产一样。 (2认同)