【问题标题】:Problem in converting local unix time to UTC unix time将本地 unix 时间转换为 UTC unix 时间的问题
【发布时间】:2019-07-24 16:40:53
【问题描述】:

我正在尝试将本地系统上的 unix 时间转换为 unix 格式的 UTC 时间,但在转换之后,最后的时间会减少 +1 小时。

为此,我编写了以下代码。

from dateutil import tz 
import time
from time 
import mktime

now_time = time.time()
print('current local unix time', now_time)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now_time)))

to_zone = tz.tzutc()
from_zone = tz.tzlocal()    

t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now_time))
utc = datetime.strptime(str(t), '%Y-%m-%d %H:%M:%S')
utc = utc.replace(tzinfo=from_zone)

central = utc.astimezone(to_zone)
print('Converted to UTC ',central)

unix_secs = mktime(central.timetuple())

print('Central unix time ',unix_secs)
print('central unix time to dattime ', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(unix_secs)))

输出如下

current local unix time 1563985835.3707478
2019-07-24 12:30:35
Converted to UTC  2019-07-24 16:30:35+00:00
Central unix time  1564003835.0
central unix time to dattime  2019-07-24 17:30:35

谁能告诉我我在这里做错了什么以及如何解决这个问题?

【问题讨论】:

    标签: python datetime time unix-timestamp


    【解决方案1】:

    我猜你在使用time.strftime 将时间戳转换为datetime 实例时使用TZ 信息错误地转换日期时间,之后datetime.strptime 或使用mktime 时。

    无论如何,有更简单的方法来实现你想要的:

    from datetime import datetime, timezone
    
    # Get current timestamp
    
    now_timestamp = time.time()
    >> 1563987839.054703
    
    # Get datetime of that timestamp but already in UTC.
    # This preserves TZ information and allows 
    # to correctly do transition to the timestamp again.
    
    utc_time = datetime.utcfromtimestamp(now_timestamp)
    >> datetime.datetime(2019, 7, 24, 17, 3, 59, 54703)
    
    # Convert UTC datetime back to timestamp
    
    utc_timestamp = utc_time.timestamp()
    >> 1563977039.054703
    
    # Verify that this timestamp is indeed UTC
    # I am in UTC+3 timezone now
    
    datetime.now()
    >> datetime.datetime(2019, 7, 24, 20, 4, 10, 500229)
    
    datetime.fromtimestamp(utc_timestamp)
    >> datetime.datetime(2019, 7, 24, 17, 3, 59, 54703)
    
    

    【讨论】:

      【解决方案2】:

      Unix 时间戳始终采用 UTC。

      它是“自 UTC 时间 1970 年 1 月 1 日星期四 00:00:00 以来经过的秒数”。

      换句话说,就是持续时间。在哪里进行此计算并不重要。减法在宇宙中的任何地方都是一样的。持续时间与时区完全无关。

      参考 - https://en.wikipedia.org/wiki/Unix_time

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多