gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:14:34 24 4
gpt4 key购买 nike

具体来说,给定我的服务器的时区(系统时间角度)和时区输入,我如何计算系统时间就好像它在那个新时区(不管夏令时等)?

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("美国/太平洋")。您可以在 pytz 库中找到所有官方时区的列表:import pytz; pytz.all_timezones

  2. 将感兴趣的日期时间/时间戳本地化到当前时区,例如

current_timezone = pytz.timezone("US/Eastern")
localized_timestamp = current_timezone.localize(timestamp)
  1. 在步骤 2 中新本地化的日期时间/时间戳上使用 .astimezone() 将所需时区的 pytz 对象作为输入转换为新时区,例如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 格式存储数据库中的所有时间戳,UTC 没有夏令时 (DST) 转换。作为一种好的做法,应该始终选择启用时区支持(即使您的用户都在同一个时区!)。这将帮助您避免困扰当今众多软件的 DST 转换问题。

除 DST 之外,软件时间通常非常棘手。要了解一般情况下在软件中处理时间有多么困难,这里有一个可能具有启发性的资源:http://yourcalendricalfallacyis.com

即使是将日期时间/时间戳转换为日期这样看似简单的操作也可能变得不那么明显。作为this helpful documentation指出:

A datetime represents a point in time. It’s absolute: it doesn’t depend on anything. On the contrary, a date is a calendaring concept. It’s a period of time whose bounds depend on the time zone in which the date is considered. As you can see, these two concepts are fundamentally different.

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

关于python - 如何将日期时间/时间戳从一个时区转换为另一个时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31977563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com