当前位置: 首页 > 面试题库 >

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

宋唯
2023-03-14
问题内容

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

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. 呼叫.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

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

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

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



 类似资料:
  • 问题内容: 我已编写此代码将当前系统日期和时间转换为其他时区。我没有收到任何错误,但没有得到预期的输出。就像我在特定时间执行程序一样。我的输出是:: 当前 印度 时间是:: :: 中部标准时间 的日期和 时间 是:: 根据 CST时区 的实际时间是:: 所以有一些 时间间隔 。而且我不知道为什么会这样。任何帮助将不胜感激..代码是:: 问题答案: 通过网络。可以用谷歌搜索。无论如何,这是一个适合您

  • 问题内容: 如何将这样的日期(在时区中)转换为时区?确保夏令时能正确处理? 问题答案: 使用和。

  • 问题内容: 基本上,我需要的是一个脚本,该脚本在提供时间和时区时可以返回另一个时区中的时间。 我的主要问题是: 从哪里获取GMT的时间偏差-是否有公共数据库可用于此? 如何也考虑夏时制(DST)的差异。 如何将其全部包装到PHP类中?或者是否已有这样的类? 问题答案: format('Y-m-d H:i:sP') . "\n"; 上面的示例将输出: 编辑:就像Pekka所说的:DateTime类从

  • 问题内容: 法国说如何将时区中的当前时间(日期时间)转换为另一个时区?我在SO中环顾四周,但没有找到任何可以帮助我的帖子。我正在使用SQL Server 2008。 问题答案: 在这里检查

  • 我想将时间戳转换为。 这是我到目前为止已经实现的,但是它给了我错误的月份 任何帮助将不胜感激。

  • 我试图找出如何在Kotlin中将转换为,这在Java中非常简单,但我在Kotlin中找不到任何等效的。 例如:历元时间戳(1970-01-01以来的秒数)== 在Kotlin中是否有解决方案,或者我是否必须在Kotln中使用Java语法?请给我一个简单的例子来说明如何解决这个问题。提前谢谢。 这个链接不是我问题的答案