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

发布于 2021-01-29 18:26:11

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

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

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

current_time_in_new_timezone = ???
关注者
0
被浏览
137
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    1. pytz.timezone为当前时区和新时区都创建一个对象,例如pytz.timezone("US/Pacific")。如果您不知道时区的官方名称,只需拨打以下电话即可找到所有官方时区的列表pytz.all_timezones

    2. 呼叫.localize()使用当前时区的pytz对象与你的日期时间/时间戳输入到它定位到当前时区。例如current_timezone.localize(timestamp)

    3. 最后,.astimezone()使用所需的新时区的pytz对象作为输入(例如),从步骤2调用新定位的日期时间/时间戳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 = 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中的数据库中,并且不进行夏令时(DST)转换。作为一种好习惯,应该始终选择启用时区支持(即使您的用户都在一个时区中!)。这将帮助您避免困扰许多软件的DST过渡问题。

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

    甚至看似简单的将日期时间/时间戳转换为日期的操作也可能变得不明显。正如该有用的文档指出的那样:

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看