Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将特定时区的时间戳转换为UTC格式的日期时间_Python_Datetime_Pytz - Fatal编程技术网

Python将特定时区的时间戳转换为UTC格式的日期时间

Python将特定时区的时间戳转换为UTC格式的日期时间,python,datetime,pytz,Python,Datetime,Pytz,我正在尝试将具有特定时区(欧洲/巴黎)的时间戳转换为UTC的日期时间格式。 在我的笔记本电脑上,它可以使用下面的解决方案,但当我在远程服务器上执行代码时(爱尔兰的AWS-Lambda函数),我的班次为1小时,因为服务器的本地时区与我的不同。 我如何拥有一个可以在我的笔记本电脑上同时在远程服务器上工作(动态处理本地时区)的代码 谢谢我不确定你收到的时间戳是什么,但我想你想要的是utcfromtimestamp() 为了完整起见,这里有另一种方法通过引用的tzlocal时区来完成同样的事情: fro

我正在尝试将具有特定时区(欧洲/巴黎)的时间戳转换为UTC的日期时间格式。 在我的笔记本电脑上,它可以使用下面的解决方案,但当我在远程服务器上执行代码时(爱尔兰的AWS-Lambda函数),我的班次为1小时,因为服务器的本地时区与我的不同。 我如何拥有一个可以在我的笔记本电脑上同时在远程服务器上工作(动态处理本地时区)的代码


谢谢

我不确定你收到的
时间戳是什么,但我想你想要的是
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