💡 没有时区信息时,默认是本地时区。基本原则:外部参数用本地时区,存储和一般流程用 UTC。
pytzpytz.timezone('Asia/Shanghai')pytz.utc
datetime对象默认时区信息为
None,但一些日期操作会默认使用系统的时区,比较保险的是调用一次astimezone()显示加上本地时区。replace(tzinfo=):不改变具体时间,只替换时区。astimezone(tz=):改变时区,同时改变到对应时区的时间,不加参数转为本地时区。
pandas.Timestamp不带时区信息,不会使用默认时区
用
tz_localize('UTC')加上时区 (replace)用
tz_convert('UTC')转换时区 (astimezone)过滤时间问题(
df[df["candle_begin_time"] > date])两边都没有时区信息时,会出现用 UTC 时间跟 UTC+8 进行对比的情况。
其中一个有时区信息时,会报错。
df 用
df["candle_begin_time"].dt.tz_localize('UTC')加上对应时区(抓取的数据一般都是 UTC 时间),date 用astimezone()显式加上本地时区。再进行对比,最准确。
String →
datetime不带时区信息,隐式使用系统时区
Pymongo / Pymodm 读取日期数据
默认不带时区信息,
astimezone()会处理成本地时区,但时间不变。加上CodecOptions会读取时区信息。
import dateutil.parser
dateutil.parser.parse('')
Local to ISO 8601:
import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748
UTC to ISO 8601:
import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856
Local to ISO 8601 without microsecond:
import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43
UTC to ISO 8601 with TimeZone information (Python 3):
import datetime
import pytz
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00
datetime.datetime.now().astimezone(pytz.UTC).isoformat()
>>> 2020-07-04T07:02:31.932029+00:00
UTC to ISO 8601 with Local TimeZone information without microsecond (Python 3):
import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00
Local to ISO 8601 with TimeZone information (Python 3):
import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00
Notice there is a bug when using astimezone() on utc time. This gives an incorrect result:
datetime.datetime.utcnow().astimezone().isoformat() #Incorrect resul
