# Date in Python

By [仓佑伽措](https://paragraph.com/@gatro) · 2021-11-07

---

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](https://www.notion.so/Pymodm-e4bf769b8dc64f029d621876c416cbc7)
    
    默认不带时区信息，`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

---

*Originally published on [仓佑伽措](https://paragraph.com/@gatro/date-in-python)*
