考虑夏时制,将EST时间戳转换为GMT

2024-03-29 07:58:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个时间戳,表示自1970年以来的毫秒数1432202088224,它转换为Thursday, May 21, 2015 5:54:48 AM EDT。我想写一个python函数,把时间戳转换成GMT中的毫秒,我不能天真地在现有的时间戳上加上4个小时(3600000毫秒),因为每年的半年我都要休息一个小时。在

我试过用datetimepytz编写一个函数

def convert_mills_GMT(milliseconds):
    converted_raw = datetime.datetime.fromtimestamp(milliseconds/1000.0)
    date_eastern = eastern.localize(converted_raw, is_dst=True)
    date_utc = date_eastern.astimezone(utc)
    return int(date_utc.strftime("%s")) * 1000

使用1432202088224的输入,这个函数返回1432220088000,当我想要的是9:54 AM时,它是Thursday, May 21, 2015 10:54:48 AM EDT。我错过了什么?在


Tags: 函数datetimedateraw时间ammayutc
2条回答

没有所谓的“EST时间戳”。如果你已经需要时间戳的话。在

要从给定毫秒数的POSIX时间戳中获取UTC时间:

>>> from datetime import datetime, timedelta
>>> timestamp = 1432202088224
>>> utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=timestamp)
>>> utc_time.strftime('%A, %B %d, %Y %H:%M:%S %p UTC')
'Thursday, May 21, 2015 09:54:48 AM UTC'

我们可以通过将UTC时间转换回“EST”时区来检查结果是否正确:

^{pr2}$

Don't use ^{}. It is not supported, and may silently fail.相反,要将UTC日期时间转换为时间戳,请使用one of the methods shown here,具体取决于您的Python版本:

Python 3.3+:

timestamp = dt.timestamp()

Python3(<;3.3):

^{pr2}$

Python 2.7+:

timestamp = (dt.replace(tzinfo=None) - datetime(1970, 1, 1)).total_seconds()

Python2号(<;2.7):

def totimestamp(dt, epoch=datetime(1970,1,1)):
    td = dt - epoch
    # return td.total_seconds()
    return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6 
timestamp = totimestamp(dt.replace(tzinfo=None))

因此,您的convert_mills_GMT应该是

def convert_mills_GMT(milliseconds, 
                      utc=pytz.utc,
                      eastern=pytz.timezone('US/Eastern')
):
    converted_raw = DT.datetime.fromtimestamp(milliseconds/1000.0)
    date_eastern = eastern.localize(converted_raw, is_dst=True)
    date_utc = date_eastern.astimezone(utc)
    timestamp = ...
    return int(timestamp) * 1000

例如,对于Python2.7

import datetime as DT
import pytz

def convert_mills_GMT(milliseconds, 
                      utc=pytz.utc,
                      eastern=pytz.timezone('US/Eastern')
):
    converted_raw = DT.datetime.fromtimestamp(milliseconds/1000.0)
    date_eastern = eastern.localize(converted_raw, is_dst=True)
    date_utc = date_eastern.astimezone(utc)
    timestamp = ((date_utc.replace(tzinfo=None) - DT.datetime(1970, 1, 1))
                 .total_seconds())
    return int(timestamp) * 1000

print(DT.datetime.utcfromtimestamp(convert_mills_GMT(1432202088224)/1000.0))

印刷品

2015-05-21 09:54:48

相关问题 更多 >