Date in Python

TimeZone

💡 没有时区信息时,默认是本地时区。基本原则:外部参数用本地时区,存储和一般流程用 UTC。

  • pytz

    • pytz.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 读取日期数据

    Pymodm

    默认不带时区信息,astimezone()会处理成本地时区,但时间不变。加上CodecOptions会读取时区信息。

ISO 8601

from

import dateutil.parser
dateutil.parser.parse('')

to

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