【问题标题】:Bash: get date and time from another time zoneBash:从另一个时区获取日期和时间
【发布时间】:2014-11-07 13:19:36
【问题描述】:


我想使用 bash 命令从另一个时区 (UTC-4) 获取日期和时间,但我不想将其配置为系统的默认 TZ。
有没有简单的方法来做到这一点?
例如 1(当前):

$ date
fri nov  7 13:15:35 UTC 2014

例如2(我需要的):

$ date (+ some option for UTC-4)
fri nov  7 09:15:35 UTC 2014

【问题讨论】:

    标签: bash date timezone


    【解决方案1】:

    你可以使用

    TZ=America/New_York date
    

    或者如果你想做日期算术,你可以使用

    date -d "+5 hours"
    

    【讨论】:

    • 谢谢@almas shaikh,第一个选项是对我的案例最准确的回复。
    • 但它要求你知道你想要的时区的正确名称,有时很难找到。您也可以使用数字偏移量,尽管这绝不是显而易见的。 timezone(3) 手册页有血淋淋的细节。
    • 也可以检查 Wikipedia 以查找例如TZ=Asia/Kolkata 是获得 IST 的一种方法(这很棘手,因为 TZ=UTC-5:30 并不完全明显;例如 UTC-5.5 不起作用)。
    • 对于 macOS 有什么方法可以实现吗? -d 参数用于日期工具中的daylight saving offset,并且没有日期字符串的参数。
    • 不适用于 Mac OS。这个TZ=UTC date -R 确实有效。
    【解决方案2】:

    我为此使用了一个小脚本,因此我不必知道或记住我正在寻找的时区的确切名称。该脚本将搜索字符串作为参数,并给出与搜索匹配的任何时区的日期和时间。我把它命名为wdate。

    #!/bin/bash
    
    # Show date and time in other time zones
    
    search=$1
    
    format='%a %F %T %z'
    zoneinfo=/usr/share/zoneinfo/posix/
    
    if command -v timedatectl >/dev/null; then
        tzlist=$(timedatectl list-timezones)
    else
        tzlist=$(find -L $zoneinfo -type f -printf "%P\n")
    fi
    
    grep -i "$search" <<< "$tzlist" \
    | while read z
      do
          d=$(TZ=$z date +"$format")
          printf "%-32s %s\n" "$z" "$d"
      done
    

    示例输出:

    $ wdate fax
    America/Halifax                  Fri 2022-03-25 09:59:02 -0300
    

    或

    $ wdate canad
    Canada/Atlantic                  Fri 2022-03-25 10:00:04 -0300
    Canada/Central                   Fri 2022-03-25 08:00:04 -0500
    Canada/Eastern                   Fri 2022-03-25 09:00:04 -0400
    Canada/Mountain                  Fri 2022-03-25 07:00:04 -0600
    Canada/Newfoundland              Fri 2022-03-25 10:30:04 -0230
    Canada/Pacific                   Fri 2022-03-25 06:00:04 -0700
    Canada/Saskatchewan              Fri 2022-03-25 07:00:04 -0600
    Canada/Yukon                     Fri 2022-03-25 06:00:04 -0700
    

    【讨论】:

      【解决方案3】:

      您可以使用TZ 中的偏移值来获取不同时区的日期:

      TZ=UTC date -R
      Fri, 07 Nov 2014 13:55:07 +0000
      
      TZ=UTC+4 date -R
      Fri, 07 Nov 2014 09:54:52 -0400
      

      【讨论】:

      • 是的,这就是TZ 使用偏移量的方式。我建议使用偏移量,因为它不需要您记住长且有效的时区名称。
      • 您不需要子shell。 TZ=UTC date 设置 TZ,运行 date,并将 TZ 的值恢复为之前的值(未设置,或不同的值,或与您指定的值相同的值,视情况而定)。
      • 另外,TZ=UTC-4 date 会混淆地将时区打印为“UTC”,即使它不是。 (这在您的示例输出中也可见。)
      • 对于--rfc-2822 格式也最好使用date -R,它也会显示正确的偏移量。
      • TZ=UTC date -R 是我可以在 Mac OS 上工作的唯一解决方案,用于我正在做的 redis 设置密钥插入并想要 UTC:redis-cli set starttime "$(TZ=UTC date -R)"
      【解决方案4】:

      如果其他解决方案不起作用,请使用

      date --date='TZ="UTC+4" 2016-08-22 10:37:44' "+%Y-%m-%d %H:%M:%S"
      

      2016-08-22 16:37:44

      【讨论】:

        猜你喜欢
        • 2014-12-21
        • 2021-10-04
        • 2015-11-07
        • 1970-01-01
        • 2013-04-06
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多