Python:如何将unixtimestamp和timezone转换为datetime对象?

时间:2015-09-01 06:47:08

标签: python python-2.7 datetime timezone unix-timestamp

我有一个csv文件,其日期时间为unixtimestamp格式,毫秒和时区信息也以毫秒为单位。我想将其转换为更实用的日期时间格式,以便进一步处理。

例如,时间为1437323953822,时区为-14400000

我可以使用

将时间戳转换为日期时间
datetime.datetime.fromtimestamp(1437323953822/1000)

但是我现在如何整合时区,即我所知道的-4 UTC时间。

(-14400000 / 1000 / 60 / 60) = -4

如何使用此时区获取实际时间?

3 个答案:

答案 0 :(得分:1)

fromtimestamp还可以为时区采用另一个参数,即tzinfo的子类:

  

classmethod datetime.fromtimestamp(timestamp[, tz])

     

返回与POSIX时间戳对应的本地日期和时间,   例如time.time()返回的。如果可选参数tz是   无或未指定,时间戳转换为平台   本地日期和时间,返回的datetime对象是天真的。

     

否则tz必须是类tzinfo子类的实例,并且   时间戳转换为tz的时区。在这种情况下,结果是   相当于   tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

答案 1 :(得分:0)

fromtimestamp()已经返回您的本地时间,即如果fromtimestamp()自动正确确定,则您无需附加utc偏移量:

#!/usr/bin/env python
from datetime import datetime

local_time = datetime.fromtimestamp(1437323953822 * 1e-3)
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000)
在某些情况下,

fromtimestamp()可能会失败,例如,如果本地时区过去有不同的utc偏移量,而fromtimestamp()在给定平台(特别是Windows)上不使用历史时区数据库。在这种情况下,从utc time和给定的utc offset明确构造本地时间:

#!/usr/bin/env python
from datetime import datetime, timedelta

utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=1437323953822)
utc_offset = timedelta(milliseconds=-14400000)
local_time = utc_time + utc_offset
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000)

Python always expects POSIX Epoch因此可以对其进行硬编码。显式公式可能更精确(没有舍入误差)并且它可以接受更宽范围的输入时间戳(fromtimestamp()范围取决于平台,并且可能比相应的datetime范围窄。)

答案 2 :(得分:0)

这个问题很老,但是我想给出一个更全面的答案。

  1. 关于Unix时间戳:
    The timestamp is the number of seconds (or milliseconds) elapsed since an absolute point in time, midnight of Jan 1 1970 in UTC time. (UTC is Greenwich Mean Time without Daylight Savings time adjustments.)

  2. fromtimestamp确实将unix时间戳转换为平台的时间。如果您在不同平台上工作,则正确设置平台的时区很重要。如果您希望使用UTC,则应使用utcfromtimestamp

  3. 要直接回答OP的问题,以下代码将基于偏移量创建一个时区。

from datetime import datetime, timezone, timedelta

ts = int('1604750712')
tz = timezone(-timedelta(hours=4))

print(datetime.fromtimestamp(ts, tz).strftime('%Y-%m-%d %H:%M:%S'))

timezone对象是tzinfo的具体类,我以距UTC 4小时的负偏移量启动了它。