Python将特定时区的时间戳转换为UTC格式的日期时间
我正在尝试将具有特定时区(欧洲/巴黎)的时间戳转换为UTC的日期时间格式。 在我的笔记本电脑上,它可以使用下面的解决方案,但当我在远程服务器上执行代码时(爱尔兰的AWS-Lambda函数),我的班次为1小时,因为服务器的本地时区与我的不同。 我如何拥有一个可以在我的笔记本电脑上同时在远程服务器上工作(动态处理本地时区)的代码Python将特定时区的时间戳转换为UTC格式的日期时间,python,datetime,pytz,Python,Datetime,Pytz,我正在尝试将具有特定时区(欧洲/巴黎)的时间戳转换为UTC的日期时间格式。 在我的笔记本电脑上,它可以使用下面的解决方案,但当我在远程服务器上执行代码时(爱尔兰的AWS-Lambda函数),我的班次为1小时,因为服务器的本地时区与我的不同。 我如何拥有一个可以在我的笔记本电脑上同时在远程服务器上工作(动态处理本地时区)的代码 谢谢我不确定你收到的时间戳是什么,但我想你想要的是utcfromtimestamp() 为了完整起见,这里有另一种方法通过引用的tzlocal时区来完成同样的事情: fro
谢谢我不确定你收到的
时间戳是什么,但我想你想要的是utcfromtimestamp()
为了完整起见,这里有另一种方法通过引用的tzlocal
时区来完成同样的事情:
from dateutil import tz
from datetime import datetime
def convert_timestamp_in_datetime_utc(timestamp_received):
dt_local = datetime.fromtimestamp(timestamp_received, tz.tzlocal())
if tz.datetime_ambiguous(dt_local):
raise AmbiguousTimeError
if tz.datetime_imaginary(dt_local):
raise ImaginaryTimeError
return dt_local.astimezone(tz.tzutc())
class AmbiguousTimeError(ValueError):
pass
class ImaginaryTimeError(ValueError):
pass
(我在AmbiguustimeError
和ImaginaryTimeError
条件中添加了模拟pytz
界面的条件。)请注意,我将包括这一点,以防您出于某种原因遇到类似问题,需要参考本地时区-如果您有某种东西可以在UTC中给出正确答案,最好使用它,然后使用astimezone
将它放入您想要的任何本地区域
它的工作原理
既然你在评论中表示,你仍然对这是如何工作的有点困惑,我想我应该澄清一下这是为什么。有两个函数可将时间戳转换为datetime.datetime
对象,以及:
utcfromtimestamp(timestamp)
将为您提供表示UTC时间的原始datetime
。然后,您可以执行dt.replace(tzinfo=pytz.utc)
(或任何其他utc
实现-datetime.timezone.utc
,dateutil.tz.tzutc()
,等等)以获得已知的日期时间,并将其转换为您想要的任何时区
fromtimstamp(timestamp,tz=None)
,当tz
不是None
时,将为您提供一个感知的datetime
等价于utcfromtimestamp(timestamp)。替换(tzinfo=timezone.utc)。astimezone(tz)
。如果tz
为None
,则它将转换为您的本地时间(相当于dateutil.tz.tzlocal()
),然后返回原始的datetime
从Python3.6开始,您可以在NaiveDateTimes上使用,时区将假定为系统本地时间。因此,如果您正在开发Python>=3.6应用程序或库,您可以使用datetime.fromtimstamp(timestamp).astimezone(whatever\u timezone)
或datetime.utcfromtimestamp(timestamp).replace(tzinfo=timezone.utc).astimezone(whatever\u timezone)
作为等价物。我不确定我是否理解这个问题-这是如何失败的?什么是“接收的时间戳”?我能想象失败的唯一原因是时间戳是本地时间的时间戳,它是从基于本地时区(欧洲/巴黎)的法国网站提取的时间戳。当我执行此函数时,如果我在笔记本电脑上或通过Lambda函数执行,则return datetime的偏移量为1小时。我想问题是“datetime.datetime.fromtimestamp”是基于本地时区的…非常感谢Paul,它与第一个解决方案一起工作!对于不同时区的日期时间/时间戳操作,我仍然感到困惑:(@Matt我更新了我的答案,希望这能澄清发生了什么。非常感谢你的解释!现在我更清楚了。
import pytz
from datetime import datetime
def convert_timestamp_in_datetime_utc(timestamp_received):
dt_naive_utc = datetime.utcfromtimestamp(timestamp_received)
return dt_naive_utc.replace(tzinfo=pytz.utc)
from dateutil import tz
from datetime import datetime
def convert_timestamp_in_datetime_utc(timestamp_received):
dt_local = datetime.fromtimestamp(timestamp_received, tz.tzlocal())
if tz.datetime_ambiguous(dt_local):
raise AmbiguousTimeError
if tz.datetime_imaginary(dt_local):
raise ImaginaryTimeError
return dt_local.astimezone(tz.tzutc())
class AmbiguousTimeError(ValueError):
pass
class ImaginaryTimeError(ValueError):
pass