Python将具有特定时区的时间戳转换为UTC的日期时间

时间:2017-01-12 12:58:01

标签: python datetime pytz

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

import pytz
import datetime

def convert_timestamp_in_datetime_utc(timestamp_received):
    utc = pytz.timezone('UTC')
    now_in_utc = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(pytz.UTC)
    fr = pytz.timezone('Europe/Paris')
    new_date = datetime.datetime.fromtimestamp(timestamp_received)
    return fr.localize(new_date, is_dst=None).astimezone(pytz.UTC)

由于

1 个答案:

答案 0 :(得分:2)

我不确定timestamp_received是什么,但我认为你想要的是utcfromtimestamp()

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)

为了完整起见,这是另一种通过引用python-dateutil 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

(我在AmbiguousTimeErrorImaginaryTimeError条件中添加了模仿pytz界面。)请注意我是否包含此内容以防您遇到类似问题出于某种原因引用本地时区 - 如果你有一些能在UTC中给出正确答案的东西,最好使用它,然后使用astimezone将它带入任何本地区域你想要它。

工作原理

既然你表示你仍然对评论中的工作方式感到有些困惑,我想我会澄清为什么会有效。有两个函数可将时间戳转换为datetime.datetime个对象,datetime.datetime.fromtimestamp(timestamp, tz=None)datetime.datetime.utcfromtimestamp(timestamp)

  1. utcfromtimestamp(timestamp)将为您提供天真 datetime,表示UTC时间。然后,您可以执行dt.replace(tzinfo=pytz.utc)(或任何其他utc实施 - datetime.timezone.utcdateutil.tz.tzutc()等)以获取有效日期时间并将其转换为您想要的任何时区。< / p>

  2. fromtimestamp(timestamp, tz=None),当tz不是None时,会为您提供感知 datetime,相当于utcfromtimestamp(timestamp).replace(tzinfo=timezone.utc).astimezone(tz) 。如果tzNone,而不是转换指定的时区,则会转换为您当地的时间(相当于dateutil.tz.tzlocal()),然后返回天真 datetime

  3. 从Python 3.6开始,您可以在天真日期时间使用datetime.datetime.astimezone(tz=None),并假定时区是系统本地时间。因此,如果您正在开发Python&gt; = 3.6应用程序或库,则可以使用datetime.fromtimestamp(timestamp).astimezone(whatever_timezone)datetime.utcfromtimestamp(timestamp).replace(tzinfo=timezone.utc).astimezone(whatever_timezone)作为等效项。