首页 > 代码库 > Python datetime与timestamp之间的转换

Python datetime与timestamp之间的转换

在用Python处理datetime和timestamp的转换时发现在时区方面,Python的处理是个大坑。

因为Python的time是默认localtime输入来处理的,导致脚本在本地运行和在服务器运行会得到不一样的结果。一不注意就会中招。

R中也会碰到时区的问题,但是R的方法提供了tz选项来指定日期的时区,简化了问题。而Python 中的time.mktime无法对时区进行指定,带来了很多麻烦。查了很久,发现有一个time.timezone的属性,可以根据运行脚本的机器的时间,来灵活处理时区问题。

以下是datetime与timestamp转换的方法, 输入和输出都以GMT0为准。

import time
def timestamp_datetime(ts,type=‘ms‘):
    """
    输入时间戳,将时间戳转换为GMT0日期时间输出
    :param ts: int整型或int字符串,默认毫秒时间
    :param type: 时间类型,输入的数据为ms或s。默认ms
    :return: GMT0的time_struct类型(但time_struct其实不含tz信息)
    """
    ts = int(ts)
    if type.lower() == ‘ms‘:
        ts = ts/1000
    elif type.lower() == ‘s‘:
        pass
    else:
        print(‘错误!时间戳请选择s或ms‘)
        return

    str_format = ‘%Y-%m-%d %H:%M:%S‘
    dt0 = time.strftime(str_format, time.gmtime(ts)) #GMT0的日期
    return dt0

def datetime_timestamp(dt0, type=‘ms‘):
    """
    输入GMT0时间的日期(或日期字符串),输出int型时间戳。默认毫秒级
    :param dt0: GMT0的时间
    :param type: 输出的时间戳类型,ms级还是s级
    :return: int型时间戳
    """
    if isinstance(dt0, str):
        ts = time.mktime(time.strptime(dt0, ‘%Y-%m-%d %H:%M:%S‘))
    else:
        ts = time.mktime(dt0)

    delta = time.timezone # mktime默认时间是本地时间,需用 ts+delta 调整时区
    if type.lower() == ‘ms‘:
        ts0 = int(ts) * 1000 - delta * 1000
    elif type.lower() == ‘s‘:
        ts0 = int(ts) - delta
    else:
        print(‘错误!时间戳请选择s或ms‘)
        return

    return ts0

  

Python datetime与timestamp之间的转换