bat脚本中设定环境变量TZ,时间差一个小时,夏时区的问题

1. 背景

项目需要在window环境中使用bat脚本拉起python程序,在bat脚本中设定TZ环境变量指定时区,但是由于时区正负号和夏时区的问题,程序获取到的时间是不对的,夏天或者慢15个小时或者快1个小时
问题说明:
1.TZ中正负号,东时区为负,当地时间-时差=utc时间,西时区为正,当地时间+时差=utc时间。(这个与通常理解东八区用+8000表示的习惯是不同的)
2.在bat脚本中使用set语句设定时注意,set语句后面不要有多余的空格,如果有会被当成是夏时区的名字,且会默认在夏天使用夏时区

2. TZ环境变量设定

tz环境变量设定 set TZ=tzn[+|-]hh[:mm[:ss]][dzn]
tzn:三字母时区名,例如PST,你必须指出本地时间距UTC的偏移量。
+|-: 东时区为负,当地时间-时差=utc时间,西时区为正,当地时间+时差=utc时间
hh:UTC与本地时间的时差,任选带符号的。
mm:分钟,由冒号(:)与hh分隔开。
ss:秒钟,用冒号(:)与mm分隔开。
dzn:三字母夏令时时区例如PDT。如果夏令时没作用,设置TZ时不设置dzn的值。

3. 测试

main.py脚本

def p_time():
    import os
    import datetime, time
    import sys

    print(time.time())
    print(time.timezone)
    print(os.environ.get('TZ'))
    print(time.strftime("%z"))
    print(time.localtime().tm_gmtoff)
    print(time.localtime().tm_zone)
    print(time.localtime())
    print(time.asctime())
    print(datetime.datetime.now())
    print(time.asctime(time.localtime()))

if __name__ == '__main__':
    p_time()

bat脚本和执行结果

错误示例: 如下会当成西八区带夏令时,比正确时间慢15小时

cd %~dp0 && set TZ=CST+08:00:00  && %~dp0miniconda3\python.exe %~dp0ai-backend\main.py

1683352090.22512
28800
CST+08:00:00
-0700
-25200

time.struct_time(tm_year=2023, tm_mon=5, tm_mday=5, tm_hour=22, tm_min=48, tm_sec=10, tm_wday=4, tm_yday=125, tm_isdst=1)
Fri May  5 22:48:10 2023
2023-05-05 22:48:10.010749
Fri May  5 22:48:10 2023

错误示例: 如下会当成东八区带夏令时,比正确时间快1小时

cd %~dp0 && set TZ=CST-08:00:00  && %~dp0miniconda3\python.exe %~dp0ai-backend\main.py

1683352164.8649793
-28800
CST-08:00:00
+0900
32400

time.struct_time(tm_year=2023, tm_mon=5, tm_mday=6, tm_hour=14, tm_min=49, tm_sec=24, tm_wday=5, tm_yday=126, tm_isdst=1)
Sat May  6 14:49:24 2023
2023-05-06 14:49:24.864979
Sat May  6 14:49:24 2023

正确示例:

cd %~dp0 && set TZ=CST-08:00:00&& %~dp0miniconda3\python.exe %~dp0ai-backend\main.py

1683352173.7227802
-28800
CST-08:00:00
+0800
28800
CST
time.struct_time(tm_year=2023, tm_mon=5, tm_mday=6, tm_hour=13, tm_min=49, tm_sec=33, tm_wday=5, tm_yday=126, tm_isdst=0)
Sat May  6 13:49:33 2023
2023-05-06 13:49:33.722780
Sat May  6 13:49:33 2023

其他正确示例, set语句和执行命令分行写

set TZ=CST-08
cd %~dp0 && %~dp0miniconda3\python.exe %~dp0ai-backend\main.py

你可能感兴趣的:(python,windows,python,开发语言,windows)