显示不同时区的时间

Posted

技术标签:

【中文标题】显示不同时区的时间【英文标题】:Display the time in a different time zone 【发布时间】:2022-01-20 02:14:15 【问题描述】:

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

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

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

【问题讨论】:

完全复制:***.com/questions/117514/… 谢谢。搜索主题时没有找到。 How do I use timezones with a datetime object in python?的可能重复 【参考方案1】:

更简单的方法:

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 这样的外部依赖。【参考方案2】:

您可以使用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 回答了“当前时间”部分 我不想使用外部库。我只想使用本机库。那我该怎么办? 2021年this is the way to go Python 3.9+ 在 standard 库中有一个新模块,称为 zoneinfo。不再需要像 pytz 这样的外部依赖。【参考方案3】:

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 很好!其实我也想添加这个选项,从来没有花时间。谢谢提醒 ;-)【参考方案4】:

一种方式,通过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 中完美运行。非常感谢。【参考方案5】:

问题的最短答案可以是:

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

这将打印:

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

【讨论】:

我不想使用外部库。我只想使用本机库。那我该怎么办?【参考方案6】:

这个使用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【参考方案7】:

这是我的实现:

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

【讨论】:

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

可以通过从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 感谢您的关注。我已编辑我的答案以包括加尔各答而不是印度。【参考方案9】:

我一直需要时间信息,所以我的服务器上有这个简洁的 .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'),

【讨论】:

【参考方案10】:

我最终在我的代码中使用了很多 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>2dt_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>2dt_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 分钟,但仍然会得到匹配。

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

【讨论】:

【参考方案11】:

您可以查看this question。

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

【讨论】:

以上是关于显示不同时区的时间的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JavaScript 的 New Date() 函数在不同时区显示相同? [复制]

请问android studio如何通过代码获得不同时区的时间,比如界面按一下美国的按钮,显示的就是美国的时间

Php:根据用户更改时区[重复]

js 如何把一个本地时间 转换为其他时区的时间

检查不同时区的营业时间

linux里date命令显示的时间和自己的不对。说是cst,啥意思,是时区问题吗。