Python:如何将datetime/timestamp从一个时区转换到另一个时区?

2024-06-01 02:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

具体来说,考虑到服务器的时区(系统时间透视图)和时区输入,如何计算系统时间,就好像它在新时区中一样(不考虑夏令时等)?

import datetime
current_time = datetime.datetime.now() #system time

server_timezone = "US/Eastern"
new_timezone = "US/Pacific"

current_time_in_new_timezone = ???

Tags: import服务器newdatetimeservertime系统时间
2条回答

如果您知道您的原始时区和要将其转换为的新时区,请首先使用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?

有两个步骤:

  1. 从系统时间和时区创建感知日期时间对象例如,要获取给定时区中的当前系统时间:

    #!/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%的可能性)。

    如果您确定您的输入时间存在于服务器的时区中并且它是唯一的,那么您可以通过is_dst=None来断言:

    server_time = server_timezone.localize(naive_time, is_dst=None)
    

    它会引发无效时间的异常。
    如果可以忽略每天错误(虽然由于DST导致的错误通常在一小时左右),那么可以删除is_dst参数:

    server_time = server_timezone.normalize(server_timezone.localize(naive_time))
    

    调用.normalize()来调整不存在的时间(间隙中的本地时间,在“spring-forward”转换期间)。如果时区规则没有更改,则服务器不应生成不存在的时间。见"Can I just always set is_dst=True?"

  2. 将感知日期时间对象转换为目标时区tz

    tz = pytz.timezone("US/Pacific")
    server_time_in_new_timezone = server_time.astimezone(tz)
    

相关问题 更多 >