utc时间戳 - python毫秒转时间




如何在Python中将本地时间转换为UTC? (12)

简单

我是这样做的:

>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996

幻想

如果你想变得有趣,你可以把它变成一个仿函数:

class to_utc():
utc_delta = datetime.utcnow() - datetime.now()

def __call__(cls, t):
    return t + cls.utc_delta

结果:

>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996

如何将本地时间的日期时间字符串转换为UTC时间字符串

我确信我以前做过这些,但是找不到它,所以希望将来可以帮助我(和其他人)做到这一点。

澄清 :例如,如果我有我的本地时区( +102008-09-17 14:02:00 ,我想用等效的UTC时间生成一个字符串: 2008-09-17 04:02:00

此外,从http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ ,请注意,一般来说,这是不可能的,因为与DST和其他问题不存在从本地时间到UTC时间。


pytz还有一个例子,但包含localize(),它保存了我的一天。

import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')

dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'

以下是对常见Python时间转换的总结

  • struct_time(UTC)→POSIX:
    calendar.timegm(struct_time)
  • 幼稚的日期时间(本地)→POSIX:
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
  • Naïve日期时间(UTC)→POSIX:
    calendar.timegm(dt.utctimetuple())
  • Aware datetime→POSIX:
    calendar.timegm(dt.utctimetuple())
  • POSIX→struct_time(UTC):
    time.gmtime(t)
  • 幼稚的日期时间(本地)→struct_time(UTC):
    stz.localize(dt, is_dst=None).utctimetuple()
  • Naïve日期时间(UTC)→struct_time(UTC):
    dt.utctimetuple()
  • Aware datetime→struct_time(UTC):
    dt.utctimetuple()
  • POSIX→Naïve日期时间(本地):
    datetime.fromtimestamp(t, None)
  • struct_time(UTC)→Naïvedatetime(local):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Naïve日期时间(UTC)→Naïve日期时间(本地):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Aware datetime→Naïvedatetime(local):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX→Naïve日期时间(UTC):
    datetime.utcfromtimestamp(t)
  • struct_time(UTC)→Naïvedatetime(UTC):
    datetime.datetime(struct_time[:6])
  • Naïve日期时间(本地)→Naïve日期时间(UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
  • Aware datetime→Naïvedatetime(UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX→认识日期时间:
    datetime.fromtimestamp(t, tz)
  • struct_time(UTC)→感知日期时间:
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
  • 幼稚的日期时间(本地)→感知日期时间:
    stz.localize(dt, is_dst=None)
  • 天真的日期时间(UTC)→意识到的日期时间:
    dt.replace(tzinfo=UTC)

来源: taaviburns.ca


你可以这样做:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime

在python3中:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 

在这种情况下... pytz是最好的lib

import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)

怎么样 -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

如果seconds为None则它将本地时间转换为UTC时间,否则将时间转换为UTC。


感谢@rofly,从字符串到字符串的完整转换如下:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

我对time / calendar功能的总结:

time.strptime
字符串 - >元组(没有应用时区,所以匹配字符串)

time.mktime
本地时间元组 - >自epoch以来的秒数(始终为本地时间)

time.gmtime
自epoch以来的秒数 - > UTC中的元组

calendar.timegm
UTC时间元组 - 自纪元以来的秒数

time.localtime
自时代以来的秒数 - >本地时区中的元组


我用python-dateutil获得了最大的成功:

from dateutil import tz

def datetime_to_utc(date):
    """Returns date in UTC w/o tzinfo"""
    return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date

日期时间模块的utcnow()函数可用于获取当前UTC时间。

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

正如Tom上面提到的链接: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ : http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/说:

UTC是没有夏时制时区的时区,并且仍然是没有配置更改的时区。

始终以UTC测量和存储时间

如果您需要记录时间,请分开存储。 不要存储本地时间+时区信息!

注意 - 如果您的任何数据位于使用DST的地区,请使用pytz并查看John Millikin的答案。

如果你想从一个给定的字符串获得UTC时间,并且你足够幸运的话可以在世界上一个不使用DST的地区,或者你的数据只在没有应用DST的情况下从UTC偏移:

- >使用本地时间作为偏移值的基础:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

- >或者,从一个已知的偏移量中,使用datetime.timedelta():

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'


import time

import datetime

def Local2UTC(LocalTime):

    EpochSecond = time.mktime(LocalTime.timetuple())
    utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)

    return utcTime

>>> LocalTime = datetime.datetime.now()

>>> UTCTime = Local2UTC(LocalTime)

>>> LocalTime.ctime()

'Thu Feb  3 22:33:46 2011'

>>> UTCTime.ctime()

'Fri Feb  4 05:33:46 2011'




utc