2024-06-01 02:26:50 发布
网友
具体来说,考虑到服务器的时区(系统时间透视图)和时区输入,如何计算系统时间,就好像它在新时区中一样(不考虑夏令时等)?
import datetime current_time = datetime.datetime.now() #system time server_timezone = "US/Eastern" new_timezone = "US/Pacific" current_time_in_new_timezone = ???
如果您知道您的原始时区和要将其转换为的新时区,请首先使用pytz.localize处理任何本地化(例如,夏令时等),然后使用pytz.timezone创建时区对象,最后使用datetime.astimezone(timezone)进行简单计算。例如:
pytz.localize
pytz.timezone
datetime.astimezone(timezone)
import datetime import pytz # new import my_timestamp = datetime.datetime.now() # some timestamp old_timezone = pytz.timezone("US/Eastern") new_timezone = pytz.timezone("US/Pacific") # returns datetime in the new timezone my_timestamp_in_new_timezone = old_timezone.localize(my_timestamp).astimezone(new_timezone)
当然,如果您想要的只是特定时区中的当前时间,您可以将该时区直接传递到datetime.now()中以获取时间戳。像这样:
datetime.datetime.now(new_timezone)
尽管如此,我强烈建议将所有时间戳存储为系统标准,并避免整个DST问题。有关此内容的上下文,请参见:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/
要知道处理一般的时间计算有多困难:http://yourcalendricalfallacyis.com
How do you convert datetime/timestamp from one timezone to another timezone?
有两个步骤:
从系统时间和时区创建感知日期时间对象例如,要获取给定时区中的当前系统时间:
#!/usr/bin/env python from datetime import datetime import pytz server_timezone = pytz.timezone("US/Eastern") server_time = datetime.now(server_timezone) # you could pass *tz* directly
注:^{} works even during ambiguous times例如,在DST转换期间,server_timezone.localize(datetime.now())可能失败(50%的可能性)。
server_timezone.localize(datetime.now())
如果您确定您的输入时间存在于服务器的时区中并且它是唯一的,那么您可以通过is_dst=None来断言:
is_dst=None
server_time = server_timezone.localize(naive_time, is_dst=None)
它会引发无效时间的异常。 如果可以忽略每天的错误(虽然由于DST导致的错误通常在一小时左右),那么可以删除is_dst参数:
is_dst
server_time = server_timezone.normalize(server_timezone.localize(naive_time))
调用.normalize()来调整不存在的时间(间隙中的本地时间,在“spring-forward”转换期间)。如果时区规则没有更改,则服务器不应生成不存在的时间。见"Can I just always set is_dst=True?"
.normalize()
将感知日期时间对象转换为目标时区tz:
tz
tz = pytz.timezone("US/Pacific") server_time_in_new_timezone = server_time.astimezone(tz)
如果您知道您的原始时区和要将其转换为的新时区,请首先使用
pytz.localize
处理任何本地化(例如,夏令时等),然后使用pytz.timezone
创建时区对象,最后使用datetime.astimezone(timezone)
进行简单计算。例如:当然,如果您想要的只是特定时区中的当前时间,您可以将该时区直接传递到datetime.now()中以获取时间戳。像这样:
尽管如此,我强烈建议将所有时间戳存储为系统标准,并避免整个DST问题。有关此内容的上下文,请参见:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/
要知道处理一般的时间计算有多困难:http://yourcalendricalfallacyis.com
有两个步骤:
从系统时间和时区创建感知日期时间对象例如,要获取给定时区中的当前系统时间:
注:^{} works even during ambiguous times 例如,在DST转换期间,
server_timezone.localize(datetime.now())
可能失败(50%的可能性)。如果您确定您的输入时间存在于服务器的时区中并且它是唯一的,那么您可以通过
is_dst=None
来断言:它会引发无效时间的异常。
如果可以忽略每天的错误(虽然由于DST导致的错误通常在一小时左右),那么可以删除
is_dst
参数:调用
.normalize()
来调整不存在的时间(间隙中的本地时间,在“spring-forward”转换期间)。如果时区规则没有更改,则服务器不应生成不存在的时间。见"Can I just always set is_dst=True?"将感知日期时间对象转换为目标时区
tz
:相关问题 更多 >
编程相关推荐