【问题标题】:How can I generate Unix timestamps?如何生成 Unix 时间戳?
【发布时间】:2010-11-15 08:03:40
【问题描述】:

相关问题是"Datetime To Unix timestamp",不过这个问题比较笼统。

我需要 Unix 时间戳来解决我的last question. 我的兴趣是 Python、Ruby 和 Haskell,但欢迎使用其他方法。

生成 Unix 时间戳的最简单方法是什么?

【问题讨论】:

  • @A.B.Carroll 您能否解释一下您的在线工具如何提供 Unix 时间戳?请附上手册等。它似乎提供了很多数据,但我无法真正了解目标是什么。
  • gettimeofday 是 POSIX 和 Linux 系统调用名称:stackoverflow.com/questions/11765301/… TODO:为什么 strace date +%d 不调用它?
  • 如果您使用并增加时间范围(例如分钟、天、小时),我最近编写了一个工具供我自己使用 unixtime.ninja

标签: unix unix-timestamp


【解决方案1】:

在 Ruby 中:

>> Time.now.to_i
=> 1248933648

【讨论】:

  • 对于rails,您可以使用Time.zone.now.to_i。虽然它会提供与Time.now.to)_i 相同的o/p,但Time.zone.now.to_iRails 方式。
  • 在 Rails 中,./bin/rails runner "p Time.current.to_i" 是另一种解决方案。
【解决方案2】:

首先,Unix 的“纪元”或零时间是 1970-01-01 00:00:00Z(在 Zulu 或 GMT 或 UTC 时区表示 1970 年 1 月 1 日的午夜)。 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"'

【讨论】:

    【解决方案3】:

    unix 'date' 命令的用途非常广泛。

    日期 -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

    获取date 的输出,它将采用-f 定义的格式,然后以+%s 的形式打印出来(-j 表示不要尝试设置日期),自纪元以来的秒数.

    【讨论】:

    • date: invalid option -- 'j'
    • 这是 GNU 日期扩展,不是 Unix 标准 (POSIX)。
    【解决方案4】:

    在 Perl 中:

    >> time
    => 1335552733
    

    【讨论】:

      【解决方案5】:

      在python中添加以下行以获得时间戳:

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

      【讨论】:

        【解决方案6】:

        在 Linux 或 MacOS 中您可以使用:

        date +%s
        

        在哪里

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

        现在的示例输出为 1454000043。

        【讨论】:

        • 在 Solaris 上:桁架日期 2>&1 | grep ^时间 | awk '{print $3}'
        • BSD 日期也支持 +%s。可能是通用的,因为date 通常在 POSIX.2 中定义。
        • @ĽubomírMlích 在 SmartOS 主机 (SunOS 5.11 joyent_20171026T003127Z) 上,/usr/bin/date +%s and /usr/xpg4/bin/date +%s` 都在工作。结合 POSIX.2 建议,我认为这也适用于所有 Solaris。
        • 注:加60秒:date -v+60S +%s加1天:date -v+24H +%s等。 . .
        • 如何只生成最多 3 位的毫秒数?
        【解决方案7】:

        在 Haskell 中...

        将其作为 POSIXTime 类型返回:

        import Data.Time.Clock.POSIX
        getPOSIXTime
        

        作为整数:

        import Data.Time.Clock.POSIX
        round `fmap` getPOSIXTime
        

        【讨论】:

          【解决方案8】:
          public static Int32 GetTimeStamp()
              {
                  try
                  {
                      Int32 unixTimeStamp;
                      DateTime currentTime = DateTime.Now;
                      DateTime zuluTime = currentTime.ToUniversalTime();
                      DateTime unixEpoch = new DateTime(1970, 1, 1);
                      unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
                      return unixTimeStamp;
                  }
                  catch (Exception ex)
                  {
                      Debug.WriteLine(ex);
                      return 0;
                  }
              }
          

          【讨论】:

            【解决方案9】:

            如果您需要来自 shell 脚本(Bourne 系列:sh、ksh、bash、zsh、...)的 Unix 时间戳,这应该可以在任何 Unix 机器上工作,这与其他建议(perl、haskell、ruby、python)不同, GNU 日期),它基于 POSIX 标准命令和功能。

            PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'
            

            【讨论】:

              【解决方案10】:

              curl icanhazepoch.com

              基本上它是 unix 时间戳即服务 (UTaaS)

              【讨论】:

              • 嘿,很好。这启发了我在我的爱好网站上添加一个类似的功能。 curl -L -H "Accept: application/json" unixtimesta.mp 会给你{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
              【解决方案11】:

              为了完整起见,PHP:

              php -r 'echo time();'
              

              在 BASH 中:

              clitime=$(php -r 'echo time();')
              echo $clitime
              

              【讨论】:

              • 对于 bash,我们已经有了 date 命令,所以我认为没有必要从那里调用 php。
              【解决方案12】:
              $ date +%s.%N
              

              哪里(GNU Coreutils 8.24 日期手册)

              • +%s,自 1970-01-01 00:00:00 UTC 以来的秒数
              • +%N,自纪元以来的纳秒 (000000000..999999999)

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

              【讨论】:

              • 为什么+$N 包含纳秒?它是否包含在某些系统的 UNIX 时间戳中?
              • 仅供参考,%N 没有在 macOS 10.13.1 (High Sierra) 中记录日期的手册页并且不起作用。我得到的示例输出是:1523342391.N.
              • 在 macOS 上有 gdate 在 Homebrew apple.stackexchange.com/a/135749/181223
              【解决方案13】:

              Haskell

              import Data.Time.Clock.POSIX
              
              main :: IO ()
              main = print . floor =<< getPOSIXTime
              

              Go

              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
              

              【讨论】:

                【解决方案14】:

                我们试试JavaScript:

                var t = Math.floor((new Date().getTime()) / 1000);
                

                ...或者更好的是,静态方法:

                var t = Math.floor(Date.now() / 1000);
                

                在这两种情况下,我除以 1000 以从秒变为毫秒,我使用 Math.floor 仅表示已过去的整秒(与舍入相比,舍入可能会舍入到尚未过去的整秒但是)。

                【讨论】:

                • 这是错误的。两种方法都返回 milliseconds 而不是秒,unix 时间戳是自 1970 年 1 月 1 日 00:00 UTC 以来经过的 seconds 的数量。可以用JS,除以1000四舍五入:Math.round(Date.now()/1000)
                • @LukasLiesis 那天一定是喝过咖啡的,尽管我选择了Math.floor 而不是Math.round,但我已经更新了我的答案。干杯
                【解决方案15】:

                使用 NodeJS,只需打开终端并输入:
                node -e "console.log(new Date().getTime())"node -e "console.log(Date.now())"

                【讨论】:

                  【解决方案16】:

                  在 Bash 5 中有一个新变量:

                  echo $EPOCHSECONDS
                  

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

                  echo $EPOCHREALTIME
                  

                  【讨论】:

                    【解决方案17】:

                    如果我想使用 date 命令打印 utc 日期时间,我需要在 date 命令中使用 -u 参数。

                    例子

                    date -u
                    

                    输出

                    Fri Jun 14 09:00:42 UTC 2019
                    

                    【讨论】:

                      【解决方案18】:

                      纳克:

                      $ nawk 'BEGIN{print srand()}'
                      
                      • 甚至可以在旧版本的 Solaris 和可能的其他 UNIX 系统上工作,其中没有实现 '''date +%s'''
                      • 不适用于 Linux 和其他已将 posix 工具替换为 GNU 版本(nawk -> gawk 等)的发行版
                      • 相当不直观,但绝对有趣:-)

                      【讨论】:

                        【解决方案19】:

                        对于类 Unix 环境,以下将起作用。

                        # Current UNIXTIME
                        unixtime() {
                          datetime2unixtime "$(date -u +'%Y-%m-%d %H:%M:%S')"
                        }
                        
                        # From DateTime(%Y-%m-%d %H:%M:%S)to UNIXTIME
                        datetime2unixtime() {
                          set -- "${1%% *}" "${1##* }"
                          set -- "${1%%-*}" "${1#*-}" "${2%%:*}" "${2#*:}"
                          set -- "$1" "${2%%-*}" "${2#*-}" "$3" "${4%%:*}" "${4#*:}"
                          set -- "$1" "${2#0}" "${3#0}" "${4#0}" "${5#0}" "${6#0}"
                          [ "$2" -lt 3 ] && set -- $(( $1-1 )) $(( $2+12 )) "$3" "$4" "$5" "$6"
                          set -- $(( (365*$1)+($1/4)-($1/100)+($1/400) )) "$2" "$3" "$4" "$5" "$6"
                          set -- "$1" $(( (306*($2+1)/10)-428 )) "$3" "$4" "$5" "$6"
                          set -- $(( ($1+$2+$3-719163)*86400+$4*3600+$5*60+$6 ))
                          echo "$1"
                        }
                        
                        # From UNIXTIME to DateTime format(%Y-%m-%d %H:%M:%S)
                        unixtime2datetime() {
                          set -- $(( $1%86400 )) $(( $1/86400+719468 )) 146097 36524 1461
                          set -- "$1" "$2" $(( $2-(($2+2+3*$2/$3)/$5)+($2-$2/$3)/$4-(($2+1)/$3) ))
                          set -- "$1" "$2" $(( $3/365 ))
                          set -- "$@" $(( $2-( (365*$3)+($3/4)-($3/100)+($3/400) ) ))
                          set -- "$@" $(( ($4-($4+20)/50)/30 ))
                          set -- "$@" $(( 12*$3+$5+2 ))
                          set -- "$1" $(( $6/12 )) $(( $6%12+1 )) $(( $4-(30*$5+3*($5+4)/5-2)+1 ))
                          set -- "$2" "$3" "$4" $(( $1/3600 )) $(( $1%3600 ))
                          set -- "$1" "$2" "$3" "$4" $(( $5/60 )) $(( $5%60 ))
                          printf "%04d-%02d-%02d %02d:%02d:%02d\n" "$@"
                        }
                        
                        # Examples
                        unixtime # => Current UNIXTIME
                        date +%s # Linux command
                        
                        datetime2unixtime "2020-07-01 09:03:13" # => 1593594193
                        date -u +%s --date "2020-07-01 09:03:13" # Linux command
                        
                        unixtime2datetime "1593594193" # => 2020-07-01 09:03:13
                        date -u --date @1593594193 +"%Y-%m-%d %H:%M:%S" # Linux command
                        

                        https://tech.io/snippet/a3dWEQY

                        【讨论】:

                          【解决方案20】:

                          在锈中:

                          use std::time::{SystemTime, UNIX_EPOCH};
                          
                          
                          fn main() {
                              let now = SystemTime::now();
                              println!("{}", now.duration_since(UNIX_EPOCH).unwrap().as_secs())
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-12-21
                            • 1970-01-01
                            • 2014-10-04
                            • 2012-10-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多