如何生成Unix时间戳?

343

相关问题是"Datetime To Unix timestamp",但这个问题更加普遍。

我需要Unix时间戳来解决我的上一个问题。 我对Python、Ruby和Haskell很感兴趣,但其他方法也可以接受。

如何最简单地生成Unix时间戳?


@A.B.Carroll,您能否解释一下您的在线工具如何提供Unix时间戳?请附上相关手册等资料。它似乎提供了大量数据,但我无法真正理解其目标。 - Léo Léopold Hertz 준영
gettimeofday是POSIX和Linux系统调用的名称:https://dev59.com/OGgt5IYBdhLWcg3w3xEw#11765379。待办事项:为什么`strace date +%d`没有调用它? - Ciro Santilli OurBigBook.com
如果你在工作中需要处理和增加时间范围(例如分钟、天数、小时),我最近为自己编写了一个工具https://unixtime.ninja。 - Guy Thouret
20个回答

691

在Linux或MacOS中,您可以使用:

date +%s

where

  • +%s,自1970年01月01日00:00:00 UTC以来的秒数(GNU Coreutils 8.24 Date手册)

示例输出现在为1454000043。


1
在Solaris上: truss date 2>&1 | grep ^time | awk '{print $3}' - Ľubomír Mlích
1
BSD日期还支持+%s。可能是通用的,因为“date”通常在POSIX.2中定义。 - Dereckson
如何生成仅限 3 位数毫秒? - Parveen Verma
对于想要将内容复制到剪贴板的Fish shell用户,可以使用以下一行命令:abbr --add ut "date +%s | xsel --clipboard"(可能需要安装xsel软件包。ut = unixtime,您也可以使用后者)。 - Elijah Lynn
如果您想展示到特定日期的时间戳,我们可以使用以下命令: date +%s -d YYYYMMDD (将YYYY MM DD替换为年、月和日)。 - Bin S
显示剩余2条评论

111

在 Ruby 中:

>> Time.now.to_i
=> 1248933648

对于Rails,您可以使用Time.zone.now.to_i。虽然它会给出与Time.now.to_i相同的输出,但Time.zone.now.to_i是Rails的方式。 - Swaps
在Rails中,"./bin/rails runner "p Time.current.to_i"" 是另一种解决方案。 - diveintohacking

20

curl icanhazepoch.com

基本上它是一项将Unix时间戳作为服务提供的技术(UTaaS)。


4
好的,很不错。这启发了我在我的兴趣网站上添加类似的功能。使用curl -L -H "Accept: application/json" unixtimesta.mp命令将会返回{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681} - Craig Anderson
5
自2022年8月17日起,offline的服务。 - ntippman

19
$ date +%s.%N

(GNU Coreutils 8.24 日期手册)

  • +%s,自1970年01月01日00:00:00 UTC以来的秒数
  • +%N,纳秒(000000000..999999999),自时代以来

现在的示例输出为1454000043.704350695。 我注意到BSD手册中的date标记+%s没有包含精确的解释。


为什么你要通过 +$N 包含纳秒?在某些系统中,它是否包含在UNIX时间戳中? - Léo Léopold Hertz 준영
2
FYI,%N在macOS 10.13.1(High Sierra)的日期手册中没有记录,并且无法正常工作。我得到的示例输出是:1523342391.N - nishanthshanmugham
2
在 macOS 上,Homebrew 中有 gdate。https://apple.stackexchange.com/a/135749/181223 - phil pirozhkov

19

在Python中添加以下行以获取时间戳:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

18

Bash 5 中有一个新变量:

echo $EPOCHSECONDS

或者如果您需要更高的精度(以微秒为单位):

echo $EPOCHREALTIME

我认为这是我见过的最有用的一个。 - Dmitry Gashko
在使用zsh时,可能需要使用命令zmodload zsh/datetime加载zsh/datetime模块(https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html#The-zsh_002fdatetime-Module),然后才能使用这些变量。 - Victor Yarema

12
Perl中的代码:
>> time
=> 1335552733

9

Unix的“date”命令非常多功能。

date -j -f“%a%b%d%T%Z%Y”“`date`”“+%s”

该命令将采用-f所定义格式的date输出,并以+%s表示形式打印出来(-j表示不要尝试设置日期),秒自时代以来。


4
日期:无效选项--'j' - alexia
3
这是GNU日期扩展,不在Unix标准(POSIX)中。 - jlliagre

7
首先,Unix的“纪元”或零时刻是1970年1月1日00:00:00Z(即第一次世界大战后的午夜,在Zulu、GMT或UTC时区)。Unix时间戳是自那个时间以来的秒数,不考虑闰秒。
在Perl中生成当前时间相当容易:
perl -e 'print time, "\n"'

生成与给定日期/时间值相对应的时间比较困难。从逻辑上讲,您可以使用 POSIX 中的 strptime() 函数。然而,Perl 的 POSIX::strptime 模块(与 POSIX 模块分开)具有以下签名:
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

POSIX模块中的mktime函数的签名如下:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

如果您知道数据的格式,您可以编写以下变体:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'

5

Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

前往

import "time"
t := time.Unix()

C

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

Swift

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接