显示其他时区的时间


75

是否有一种优雅的方式来显示其他时区的当前时间?

我希望本着以下一般精神:

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')>))


谢谢。当我搜索主题时找不到。
亚当·马坦

Answers:


69

您可以使用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'

3
对于问题的“当前时间”部分,您可以从loc_dt = pytz.utc.localize(datetime.utcnow())一个常量开始,而不是一个常量
patricksurry

@patricksurry:“当前时间”部分在回答最upvoted答案
JFS

我不想使用外部库。我只想使用本机库。那我该怎么办?
Vikramsinh Gaikwad

124

一个更简单的方法:

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')

1
我会说这是最好的方法。
皮查德

1
我不想使用外部库。我只想使用本机库。那我该怎么办?
Vikramsinh Gaikwad

pytz和日期时间是本地库
大卫B.

15

通过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'

3
根据文档,这仅适用于Unix。不知道这是否有所作为。
安德烈·米勒

2
我需要一个不使用pytz且只需要在Linux系统上运行的解决方案,因此这是完美的
Xandaros

3
无需pytz,这一功能就可以在AWS Lambda中完美运行。非常感谢。
sid8491

8

Python 3.9pytz弃用,因为您现在在标准库中有了zoneinfo

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

now_UTC = datetime.now(tz=timezone.utc)
now_local = now_UTC.astimezone(None)

pacifictz, israeltz = ZoneInfo('US/Pacific'), ZoneInfo('Israel')
now_pst, now_ist = now_UTC.astimezone(pacifictz), now_UTC.astimezone(israeltz)

print(f"Local time   {now_local.isoformat()}")
print(f"Pacific time {now_pst.isoformat()}")
print(f"Israeli time {now_ist.isoformat()}")
# Local time   2020-08-28T09:03:30.710001+02:00
# Pacific time 2020-08-28T00:03:30.710001-07:00
# Israeli time 2020-08-28T10:03:30.710001+03:00

较旧的Python版本:您可以zoneinfo通过反向端口使用模块使用,使用dateutil。dateutil的tz.gettz语义与zoneinfo.ZoneInfo

from dateutil.tz import gettz

pacifictz, israeltz = gettz('US/Pacific'), gettz('Israel')
now_pst, now_ist = now_UTC.astimezone(pacifictz), now_UTC.astimezone(israeltz)

print(f"Pacific time {now_pst.isoformat()}")
print(f"Israeli time {now_ist.isoformat()}")
# Pacific time 2020-08-28T00:03:30.710001-07:00
# Israeli time 2020-08-28T10:03:30.710001+03:00

7

这个问题的最短答案可以是:

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

这将打印:

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


我不想使用外部库。我只想使用本机库。那我该怎么办?
Vikramsinh Gaikwad

3

该脚本使用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

2

这是我的实现:

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')

与上一个没有什么不同。仅功能格式化且外观更干净。我将其添加为评论。哦...我不能发表评论。
OLS

1

可以通过datetimedatetime和导入模块来指定时区pytx

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
Shirish Shukla

@ShirishShukla感谢您的关注。我已经将答案编辑为包括加尔各答而不是印度。
恢复C0MMUNiSM

0

我一直都需要时间信息,因此我的服务器上有一个整洁的.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'),

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.