【问题标题】:Display the time in a different time zone显示不同时区的时间
【发布时间】:2010-11-26 18:54:05
【问题描述】:

有没有一种优雅的方式来显示另一个时区的当前时间?

我想要一些具有以下一般精神的东西:

cur = <Get the current time, perhaps datetime.datetime.now()>
print("Local time   {}".format(cur))
print("Pacific time {}".format(<something like cur.tz('PST')>))
print("Israeli time {}".format(<something like cur.tz('IST')>))

【问题讨论】:

标签: python time timezone


【解决方案1】:

您可以使用pytz 库:

>>> from datetime import datetime
>>> import pytz
>>> utc = pytz.utc
>>> utc.zone
'UTC'
>>> eastern = pytz.timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> amsterdam = pytz.timezone('Europe/Amsterdam')
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print loc_dt.strftime(fmt)
2002-10-27 06:00:00 EST-0500

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'

【讨论】:

  • 对于问题的“当前时间”部分,您可以从 loc_dt = pytz.utc.localize(datetime.utcnow()) 开始,而不是常量
  • @patricksurry:the most upvoted answer@patricksurry 回答了“当前时间”部分
  • 我不想使用外部库。我只想使用本机库。那我该怎么办?
  • Python 3.9+ 在 standard 库中有一个新模块,称为 zoneinfo。不再需要像 pytz 这样的外部依赖。
【解决方案2】:

您可以查看this question

或者尝试使用pytz。在这里您可以找到包含一些使用示例的安装指南。

【讨论】:

    【解决方案3】:

    一种方式,通过C库的时区设置,是

    >>> cur=time.time()
    >>> os.environ["TZ"]="US/Pacific"
    >>> time.tzset()
    >>> time.strftime("%T %Z", time.localtime(cur))
    '03:09:51 PDT'
    >>> os.environ["TZ"]="GMT"
    >>> time.strftime("%T %Z", time.localtime(cur))
    '10:09:51 GMT'
    

    【讨论】:

    • 根据文档,这只适用于 Unix。但不确定这是否会有所不同。
    • 我需要一个不使用pytz,只需要在Linux系统上运行的解决方案,这样就完美了
    • 这个在没有 pytz 的情况下在 AWS Lambda 中完美运行。非常感谢。
    【解决方案4】:

    更简单的方法:

    from datetime import datetime
    from pytz import timezone    
    
    south_africa = timezone('Africa/Johannesburg')
    sa_time = datetime.now(south_africa)
    print sa_time.strftime('%Y-%m-%d_%H-%M-%S')
    

    【讨论】:

    • 我会说这是最好的方法。
    • 我不想使用外部库。我只想使用本机库。那我该怎么办?
    • pytz 和 datetime 是原生库
    • @DavidB。不,pytz 是第三方库。幸运的是,zoneinfo 附带 Python 3.9 的标准库,请参阅我的回答 ;-)
    • Python 3.9+ 在 standard 库中有一个新模块,称为 zoneinfo。不再需要像 pytz 这样的外部依赖。
    【解决方案5】:

    这是我的实现:

    from datetime import datetime
    from pytz import timezone
    
    def local_time(zone='Asia/Jerusalem'):
        other_zone = timezone(zone)
        other_zone_time = datetime.now(other_zone)
        return other_zone_time.strftime('%T')
    

    【讨论】:

    • 与上一个没有什么不同。只有功能格式化和更清洁的外观。我会将其添加为评论。哦...我无法发表评论。
    【解决方案6】:

    我一直需要时间信息,所以我的服务器上有这个简洁的 .py 脚本,它让我可以选择和取消选择我想要按东->西顺序显示的时区。

    打印如下:

    Australia/Sydney    :   2016-02-09 03:52:29 AEDT+1100
    Asia/Singapore      :   2016-02-09 00:52:29 SGT+0800
    Asia/Hong_Kong      :   2016-02-09 00:52:29 HKT+0800
    EET                 :   2016-02-08 18:52:29 EET+0200
    CET                 :   2016-02-08 17:52:29 CET+0100     <- you are HERE
    UTC                 :   2016-02-08 16:52:29 UTC+0000
    Europe/London       :   2016-02-08 16:52:29 GMT+0000
    America/New_York    :   2016-02-08 11:52:29 EST-0500
    America/Los_Angeles :   2016-02-08 08:52:29 PST-0800
    

    这里的源代码是我的 github 上的一个 .py 文件: https://github.com/SpiRaiL/timezone 或直接文件链接: https://raw.githubusercontent.com/SpiRaiL/timezone/master/timezone.py

    文件中有一个这样的列表: 只需在要打印的位置添加一个“p”即可。 如果您想特别标记,请为您自己的时区添加一个“h”。

    (' ','America/Adak'),                               (' ','Africa/Abidjan'),                             (' ','Atlantic/Azores'),                            (' ','GB'),
    (' ','America/Anchorage'),                          (' ','Africa/Accra'),                               (' ','Atlantic/Bermuda'),                           (' ','GB-Eire'),
    (' ','America/Anguilla'),                           (' ','Africa/Addis_Ababa'),                         (' ','Atlantic/Canary'),                            (' ','GMT'),
    (' ','America/Antigua'),                            (' ','Africa/Algiers'),                             (' ','Atlantic/Cape_Verde'),                        (' ','GMT+0'),
    (' ','America/Araguaina'),                          (' ','Africa/Asmara'),                              (' ','Atlantic/Faeroe'),                            (' ','GMT-0'),
    (' ','America/Argentina/Buenos_Aires'),             (' ','Africa/Asmera'),                              (' ','Atlantic/Faroe'),                             (' ','GMT0'),
    (' ','America/Argentina/Catamarca'),                (' ','Africa/Bamako'),                              (' ','Atlantic/Jan_Mayen'),                         (' ','Greenwich'),
    (' ','America/Argentina/ComodRivadavia'),           (' ','Africa/Bangui'),                              (' ','Atlantic/Madeira'),                           (' ','HST'),
    (' ','America/Argentina/Cordoba'),                  (' ','Africa/Banjul'),                              (' ','Atlantic/Reykjavik'),                         (' ','Hongkong'),
    

    【讨论】:

      【解决方案7】:

      这个使用pytzdatetime 模块的脚本按要求构建:

      #!/usr/bin/env python3
      
      import pytz
      from datetime import datetime, timezone
      
      utc_dt = datetime.now(timezone.utc)
      
      PST = pytz.timezone('US/Pacific')
      IST = pytz.timezone('Asia/Jerusalem')
      
      print("UTC time     {}".format(utc_dt.isoformat()))
      print("Local time   {}".format(utc_dt.astimezone().isoformat()))
      print("Pacific time {}".format(utc_dt.astimezone(PST).isoformat()))
      print("Israeli time {}".format(utc_dt.astimezone(IST).isoformat()))
      

      它输出以下内容:

      $ ./timezones.py 
      UTC time     2019-02-23T01:09:51.452247+00:00
      Local time   2019-02-23T14:09:51.452247+13:00
      Pacific time 2019-02-22T17:09:51.452247-08:00
      Israeli time 2019-02-23T03:09:51.452247+02:00
      

      【讨论】:

      • 既然已经有了timezone,为什么还要使用pytz
      【解决方案8】:

      问题的最短答案可以是:

      from datetime import datetime
      import pytz
      print(datetime.now(pytz.timezone('Asia/Kolkata')))
      

      这将打印:

      2019-06-20 12:48:56.862291+05:30

      【讨论】:

      • 我不想使用外部库。我只想使用本机库。那我该怎么办?
      【解决方案9】:

      可以通过从datetimepytx 导入模块datetime 来指定时区。

      from datetime import datetime
      import pytz
      
      tz_NY = pytz.timezone('America/New_York') 
      datetime_NY = datetime.now(tz_NY)
      print("NY time:", datetime_NY.strftime("%H:%M:%S"))
      
      tz_London = pytz.timezone('Europe/London')
      datetime_London = datetime.now(tz_London)
      print("London time:", datetime_London.strftime("%H:%M:%S"))
      
      tz_India = pytz.timezone('Asia/Kolkata')
      datetime_India = datetime.now(tz_India)
      print("India time:", datetime_India.strftime("%H:%M:%S"))
      

      【讨论】:

      • 它的“亚洲/加尔各答”而不是“亚洲/印度”,获取所有可用的 tzs:pytz.all_timezones
      • @ShirishShukla 感谢您的关注。我已编辑我的答案以包括加尔各答而不是印度。
      【解决方案10】:

      Python 3.9:使用标准库中的zoneinfo

      from datetime import datetime, timezone
      from zoneinfo import ZoneInfo
      
      # Israel and US/Pacific time:
      now_Israel = datetime.now(ZoneInfo('Israel'))
      now_Pacific = datetime.now(ZoneInfo('US/Pacific'))
      print(f"Israeli time {now_Israel.isoformat(timespec='seconds')}")
      print(f"Pacific time {now_Pacific.isoformat(timespec='seconds')}")
      # Israeli time 2021-03-26T18:09:18+03:00
      # Pacific time 2021-03-26T08:09:18-07:00
      
      # for reference, local time and UTC:
      now_UTC = datetime.now(tz=timezone.utc)
      now_local = datetime.now().astimezone()
      print(f"Local time   {now_local.isoformat(timespec='seconds')}")
      print(f"UTC          {now_UTC.isoformat(timespec='seconds')}")
      # Local time   2021-03-26T16:09:18+01:00 # I'm on Europe/Berlin
      # UTC          2021-03-26T15:09:18+00:00
      

      注意:deprecation shim 对应于 pytz

      Python 3 的旧版本:您可以通过backports 模块使用zoneinfo,也可以改用dateutil。 dateutil 的tz.gettz 遵循与zoneinfo.ZoneInfo 相同的语义:

      from dateutil.tz import gettz
      
      now_Israel = datetime.now(gettz('Israel'))
      now_Pacific = datetime.now(gettz('US/Pacific'))
      print(f"Israeli time {now_Israel.isoformat(timespec='seconds')}")
      print(f"Pacific time {now_Pacific.isoformat(timespec='seconds')}")
      # Israeli time 2021-03-26T18:09:18+03:00
      # Pacific time 2021-03-26T08:09:18-07:00
      

      【讨论】:

      • 使用datetime.now(tz=gettz('US/Pacific'))有什么问题?
      • @LeonardRick 很好!其实我也想添加这个选项,从来没有花时间。谢谢提醒 ;-)
      【解决方案11】:

      我最终在我的代码中使用了很多 pandas,如果我不需要导入额外的库,我不喜欢,所以这是我正在使用的一个简单而干净的解决方案:

      import pandas as pd
      
      t = pd.Timestamp.now('UTC') #pull UTC time
      t_rounded = t.round('10min') #round to nearest 10 minutes
      now_UTC_rounded = f"{t_rounded.hour:0>2d}{t_rounded.minute:0>2d}" #makes HH:MM format
      
      t = pd.Timestamp.now(tz='US/Eastern') #pull Eastern (EDT or EST, as current) time
      t_rounded = t.round('10min') #round to nearest 10 minutes
      now_EAST_rounded = f"{t_rounded.hour:0>2d}{t_rounded.minute:0>2d}" #makes HH:MM format
      
      print(f"The current UTC time is: {now_UTC_rounded} (rounded to the nearest 10 min)")
      print(f"The current US/Eastern time is: {now_EAST_rounded} (rounded to the nearest 10 min)")
      

      输出:

      The current UTC time is: 1800 (rounded to the nearest 10 min)
      The current US/Eastern time is: 1400 (rounded to the nearest 10 min)
      

      (实际东部时间为 14:03) 舍入功能很不错,因为如果您试图在特定时间触发某些东西,例如整点,您可能会在任何一方错过 4 分钟,但仍然会得到匹配。

      只是炫耀功能——如果你不想的话,显然你不需要使用回合!

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 2018-09-07
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 2019-05-20
        相关资源
        最近更新 更多