时间字符串-->时间戳,时区的问题

211 阅读1分钟

场景:

国外新闻,很多需要做这种转换。新闻源是时间字符串,产品是全球化的,需要转成时间戳

代码:

def make_timestamp(time_str, time_format='%Y-%m-%d'):
    """
    时间字符串-->毫秒时间戳
    注意:time_raw 如果是0时区的时间,则需对结果时间戳 +28800; 如果是+8时区时间,则无需额外操作。
    :param time_str: 时间字符串
    :param time_format: 时间格式,常用:%Y-%m-%d %H:%M:%S 或 %Y-%m-%dT%H:%M:%SZ
    :return: 毫秒时间戳
    """
    # 判断是否是夏令时
    is_dst = time.daylight and time.localtime().tm_isdst
    # 计算差值
    offset = time.altzone if is_dst else time.timezone
    # 计算时间戳
    return (int(datetime.strptime(time_str, time_format).timestamp()) - offset - 28800) * 1000

坑:

Windows系统下,altzone与timezone返回值 相差1小时。最好用timezone,小概率夏令时,才会用altzone

image.png

参考:

1、stackoverflow.com/questions/1…

2、www.cnblogs.com/lambs/p/855…

3、夏时制(美国及加拿大英语:daylight time),又称夏令时日光节约时间(美国及加拿大称为daylight saving time,简称DST;英国与其他地区称为Summer Time),是一种在夏季月份牺牲正常的日出时间,而将时间调快的做法。通常使用夏时制的地区,会在接近春季开始的时候,将时间调快一小时,并在秋季调回正常时间[1]。实际上,夏时制会造成在春季转换当日的睡眠时间减少一小时,而在秋季转换当日则会多出一小时的睡眠时间[2][3]