Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

问题描述 投票:22回答:2

具体来说,给定服务器的时区(系统时间角度)和时区输入,我如何计算系统时间,就像它在那个新时区中一样(无论夏时制如何?)>]

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

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

current_time_in_new_timezone = ???

特别是给定服务器的时区(系统时间角度)和时区输入,我如何计算系统时间,就像它在那个新时区中一样(无论夏令时如何……)]] >>

如果您知道原始时区和要将其转换为的新时区,结果将非常简单:

1]为当前时区和新时区都创建一个pytz.timezone对象,例如pytz.timezone("US/Pacific")。如果您不知道时区的正式名称,只需拨打pytz.all_timezones

即可找到所有官方时区的列表

2]使用当前时区的pytz对象以及您的日期时间/时间戳作为输入来调用.localize(),以将其本地化为当前时区。例如current_timezone.localize(timestamp)

3)最后,使用所需的新时区的pytz对象作为输入,例如,从步骤2开始在新定位的日期时间/时间戳上调用.astimezone()localized_timestamp.astimezone(new_timezone)

完成!

作为完整示例:

import datetime
import pytz

# a timestamp I'd like to convert
my_timestamp = datetime.datetime.now()

# create both timezone objects
old_timezone = pytz.timezone("US/Eastern")
new_timezone = pytz.timezone("US/Pacific")

# two-step process
localized_timestamp = old_timezone.localize(my_timestamp)
new_timezone_timestamp = timezone_localized_timestamp.astimezone(new_timezone)

# or alternatively, as an one-liner
new_timezone_timestamp = old_timezone.localize(my_timestamp).astimezone(new_timezone) 

奖金:但是,如果您需要的只是特定时区的当前时间,您可以方便地将该时区直接传递到datetime.now()以直接获取当前时间:

datetime.datetime.now(new_timezone)

一般来说,在需要进行时区转换时,我强烈建议您应将所有时间戳存储在UTC中的数据库中,而UTC不会进行夏令时(DST)转换。作为一种好习惯,应该始终选择启用时区支持(即使您的用户都在一个时区中!)。这将帮助您避免困扰许多软件的DST过渡问题。

除了DST,在软件中的时间通常很棘手。为了大致了解在软件中处理时间有多困难,这里有一个潜在的启发性资源:http://yourcalendricalfallacyis.com

即使是看似简单的操作,因为将日期时间/时间戳转换为日期也会变得不明显。 this helpful documentation指出:

日期时间代表时间点

。绝对是绝对的:它不依赖任何内容。相反,日期是日历概念。这是一个时间段,其范围取决于考虑日期的时区。如您所见,这两个概念根本不同。

了解这种差异是避免基于时间的错误的关键一步。祝你好运。

如何将日期时间/时间戳从一个时区转换为另一个时区?

有两个步骤:

  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
    

    注意:datetime.now(server_timezone) works even during ambiguous times例如,在DST转换期间,而datetime.now(server_timezone)可能会失败(机会为50%)。

    如果您确定输入的时间在服务器的时区中并且是唯一的,则可以传递server_timezone.localize(datetime.now())来断言:

    is_dst=None

    它为无效时间引发异常。如果可以忽略不超过一天

    的错误(尽管通常由于DST引起的错误大约在一个小时内),则可以删除server_time = server_timezone.localize(naive_time, is_dst=None) 参数:
    is_dst

    server_time = server_timezone.normalize(server_timezone.localize(naive_time)) 被调用以调整不存在的时间(在“弹簧向前”过渡期间,间隙中的本地时间)。如果时区规则未更改;您的服务器不应产生不存在的时间。参见.normalize()

  2. 将已知的日期时间对象转换为目标时区"Can I just always set is_dst=True?"

    tz
python datetime timezone pytz timedelta
2个回答
33
投票

如果您知道原始时区和要将其转换为的新时区,结果将非常简单:


4
投票

如何将日期时间/时间戳从一个时区转换为另一个时区?

© www.soinside.com 2019 - 2024. All rights reserved.