在用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
时间: 2024-10-06 05:53:01