【问题标题】:Create timestamp variable in bash script在 bash 脚本中创建时间戳变量
【发布时间】:2013-06-08 14:38:03
【问题描述】:

我正在尝试在 shell 脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本开头创建变量,并在我发出echo $timestamp 时打印出当前时间。事实证明这比我想象的要难。以下是我尝试过的一些事情:

timestamp="(date +"%T")" echo 打印出(date +"%T")

timestamp="$(date +"%T")" echo 打印变量初始化的时间。

我尝试过的其他事情只是轻微的变化,并没有更好的效果。有谁知道如何完成我想做的事情?

【问题讨论】:

    标签: bash variables timestamp


    【解决方案1】:

    如果你想获取unix时间戳,那么你需要使用:

    timestamp=$(date +%s)
    

    %T 会给你时间;与%H:%M:%S 相同(通过http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/

    【讨论】:

    • 但是这个变量只会保存变量启动时的值,对吗?
    • 我想这得到了很多支持,因为它回答了问题的标题,但它没有回答问题主体:D OP 每次都希望获得不同的时间戳,而这将存储一个用于整个脚本。
    • 我来这里就是为了找这个。 IE。从 date 获取 unix 时间戳的正确格式字符串。但是,我也赞成“正确”的答案。我不是在寻找那个,但它是对原始问题的更好答案,它对我也非常有用。
    • 在添加 'shell`timestamp=$(shell date +%s)987654326@ 后工作得很好
    【解决方案2】:

    为了获取当前时间戳而不是定义固定变量的时间,诀窍是使用函数而不是变量:

    #!/bin/bash
    
    # Define a timestamp function
    timestamp() {
      date +"%T" # current time
    }
    
    # do something...
    timestamp # print timestamp
    # do something else...
    timestamp # print another timestamp
    # continue...
    

    如果您不喜欢%T 说明符给出的格式,您可以结合date 接受的其他时间转换说明符。对于 GNU date,您可以在此处的官方文档中找到这些说明符的完整列表:https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

    【讨论】:

    • 根据您打算如何使用它,您仍然需要使用命令替换:echo "$(timestamp): something happened"
    • 至于格式,这里有一组最常见的格式:zxq9.com/archives/795
    • 对我来说,我想要date +"%Y-%m-%d_%H-%M-%S"
    • 由于某种原因,这并没有给我时间戳,而是当前时间,中间有“:”。
    • 我认为很多人来到这个问题是为了寻找一种生成 unix 时间戳的方法(正如我所拥有的)并发现 dchakarov 的答案更有用,即使这个答案更好地解决了提问者的问题问题。
    【解决方案3】:
    DATE=`date "+%Y%m%d"`
    
    DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
    

    【讨论】:

    • +1 用于添加毫秒部分。这个echo $(date +"%Y-%m-%dT%T.%3N%z") 但是我不能让它在 Mac 终端上工作。如何在 Mac 中做同样的事情。谢谢
    【解决方案4】:

    ISO 8601 格式 (2018-12-23T12:34:56) 比 UNIX 时间戳更具可读性。但是,在某些操作系统上,文件名中不能包含 :。因此,我建议改用这样的东西:

    2018-12-23_12-34-56
    

    您可以使用以下命令来获取这种格式的时间戳:

    TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`
    

    这是我见过的许多应用程序使用的格式。另一个好处是,如果您的文件名以此开头,您可以按字母顺序对它们进行排序,它们将按日期排序。

    【讨论】:

    • TZ=UTC date +... 可以通过使用 UTC 时间戳使其更便携
    • 合并@MichaelChirico 的评论并在末尾添加祖鲁时间 (== UTC) Z;并修改@Caner 以使用T: TIMESTAMP="$(TZ=UTC date +%Y-%m-%dT%H_%M_%SZ)"
    【解决方案5】:

    对于我的欧洲同胞,尝试使用这个:

    timestamp=$(date +%d-%m-%Y_%H-%M-%S)
    

    将给出格式的格式:“15-02-2020_19-21-58”

    你调用变量并得到这样的字符串表示

    $timestamp
    

    【讨论】:

    • 请考虑为您的代码使用代码符号。
    • 或通用解决方案:date +%Y-%m-%d_%H-%M-%S - 感谢您的回答。
    【解决方案6】:

    您可以参考下表根据需要生成时间戳:

            Format/result           |       Command              |          Output
    --------------------------------+----------------------------+------------------------------
    YYYY-MM-DD                      | date -I                    | $(date -I)
    YYYY-MM-DD_hh:mm:ss             | date +%F_%T                | $(date +%F_%T)
    YYYYMMDD_hhmmss                 | date +%Y%m%d_%H%M%S        | $(date +%Y%m%d_%H%M%S)
    YYYYMMDD_hhmmss (UTC version)   | date --utc +%Y%m%d_%H%M%SZ | $(date --utc +%Y%m%d_%H%M%SZ)
    YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z      | $(date +%Y%m%d_%H%M%S%Z)
    YYYYMMSShhmmss                  | date +%Y%m%d%H%M%S         | $(date +%Y%m%d%H%M%S)
    YYYYMMSShhmmssnnnnnnnnn         | date +%Y%m%d%H%M%S%N       | $(date +%Y%m%d%H%M%S%N)
    YYMMDD_hhmmss                   | date +%y%m%d_%H%M%S        | $(date +%y%m%d_%H%M%S)
    Seconds since UNIX epoch:       | date +%s                   | $(date +%s)
    Nanoseconds only:               | date +%N                   | $(date +%N)
    Nanoseconds since UNIX epoch:   | date +%s%N                 | $(date +%s%N)
    ISO8601 UTC timestamp           | date --utc +%FT%TZ         | $(date --utc +%FT%TZ)
    ISO8601 UTC timestamp + ms      | date --utc +%FT%T.%3NZ     | $(date --utc +%FT%T.%3NZ)
    ISO8601 Local TZ timestamp      | date +%FT%T%Z              | $(date +%FT%T%Z)
    YYYY-MM-DD (Short day)          | date +%F\(%a\)             | $(date +%F\(%a\))
    YYYY-MM-DD (Long day)           | date +%F\(%A\)             | $(date +%F\(%A\))
    

    【讨论】:

    • 我不必经常滚动浏览其他 11 个答案来找到最佳答案。 :)
    【解决方案7】:

    使用命令替换:

    timestamp=$( date +%T )
    

    【讨论】:

    • 这是我已经尝试过的,它只打印出变量初始化的时间。
    • @dan08:这就是变量的工作方式。如果您想要动态输出,请使用函数。
    【解决方案8】:

    我使用的是 ubuntu 14.04。

    我系统中正确的方式应该是date +%s

    date +%T 的输出类似于12:25:25

    【讨论】:

      【解决方案9】:

      你可以使用

      timestamp=`date --rfc-3339=seconds`
      

      这以2014-02-01 15:12:35-05:00 的格式提供

      反引号 (`) 字符将导致计算它们之间的内容并将结果包含在行中。 date --help 有其他选择。

      【讨论】:

      • 至于它得到什么时间,这应该在包含在屏幕输出或旨在列出输出时间的日志文件之前立即执行。
      • 由于输出中的空间,这不是理想的时间戳格式。请务必在使用中引用它“$timestamp”,否则您将获得该命令的两个参数。例如touch $timestamp 会产生两个文件。
      • 对于那些想要自定义删除空间的人来说,date --rfc-3339=... (大致?)相当于date '+%F %T%:z',所以删除空间很简单(例如):date '+%F_%T%:z'
      【解决方案10】:

      很多答案,但找不到我想要的:

      date +"%s.%3N"
      

      返回类似:1606297368.210

      【讨论】:

      • MacOS 内置的date 不支持%N 格式;见stackoverflow.com/a/33641565/1677912
      • 是的,很多答案,其中大部分是错误的,因为人们显然没有阅读问题
      • 这行得通,我想知道符号N是什么意思
      • @JerryAn 纳秒可能。
      【解决方案11】:

      bash 的最新版本不需要调用外部程序 date

      printf -v timestamp '%(%T)T'
      

      %(...)T 使用相应的参数作为 UNIX 时间戳,并根据括号之间的strftime 样式格式对其进行格式化。 -1 的参数对应于当前时间,当没有歧义时可以省略。

      【讨论】:

        【解决方案12】:
        timestamp=$(awk 'BEGIN {srand(); print srand()}')
        

        没有值的 srand 在大多数 Awk 实现中使用当前时间戳。

        【讨论】:

        • fwiw,对性能感到好奇:以下打印相同:(1)awk '....'(如上图); (2)date '+%s'; (3)printf '%(%s)T';按性能提高的顺序列出:在我的系统上,dateawk 快大约 2 倍; printfdate 快 50 倍以上,比 awk 快 100 倍。
        【解决方案13】:

        如果关注性能,@chepner 的 answer 无疑是赢家。

        如果稍微复杂一点,您还可以仅使用 bash 内置函数获得微秒或毫秒的粒度。下面是一个发出当前时间戳(包括毫秒)的函数示例:

        timestamp() {
            IFS=. read S US <<<$EPOCHREALTIME # Read epoch seconds/microseconds
            MS=$((10#$US/1000)) # Convert to milliseconds (interpret in base-10, even with leading 0)
            printf '%(%F %T)T.%03i' $S $MS # Emit formatted timestamp
        }
        
        TS=$(timestamp) # Invoke function, assign to variable
        

        请注意,printf 格式可以调整为您喜欢的日期/时间格式。

        【讨论】:

          【解决方案14】:

          这比您要求的要多一些,因此您可以根据需要对其进行自定义。

          我正在尝试在 shell 脚本中创建时间戳变量...

          此脚本将允许您创建一个变量。虽然我不完全确定更改 shell 上下文时的可重用性。但它会完成这项工作。

          function timestamp {
              TEXT="Date:"
              DATE=`date +%Y-%m-%d`
              TIME=`date +%H:%M:%S`
              ZONE=`date +"%Z %z"`
              echo $TEXT $DATE $TIME $ZONE
          }
          
          function fulldate {
            timevariable=$(timestamp)
            echo $timevariable
          }
          
          echo "- Output 1:"
          timestamp
          echo "- Output 2:"
          fulldate
          echo "- Output 3:"
          echo $timevariable
          

          输出:

          - Output 1:
          Date: 2021-08-12 23:28:08 UTC +0000
          - Output 2:
          Date: 2021-08-12 23:28:08 UTC +0000
          - Output 3:
          Date: 2021-08-12 23:28:08 UTC +0000
          

          我已经在 GNU bash 版本 4.4.23(1)-release (x86_64-pc-msys) 上对此进行了测试

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-28
            • 1970-01-01
            • 2017-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-20
            相关资源
            最近更新 更多