# datetime库常用转换

#### 把datatime类型的时间转换为需要的格式

> > from datetime import datetime time\_str = "2016-09-10 4:23:21" time = datetime.strptime(time\_str, '%Y-%m-%d %H:%M:%S')# 根据字符串本身的格式进行转换 time.strftime('%Y-%m-%d-%H-%M') Out>>'2016-09-10-04-23'

### python 将带有TZ的UTC时间字符串，转换成本地时间

> 整个地球分为二十四时区，每个时区都有自己的本地时间。在国际无线电通信中，为统一而普遍使用一个标准时间，称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样，都与英国伦敦的本地时相同。UTC与GMT含义完全相同。北京时区是东八区，领先UTC 8个小时。所以将UTC装换成北京时间时，需要加上8小时。

```python
import datetime


origin_date_str= "2019-07-26T08:20:54Z"
utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%SZ")
local_date = utc_date + datetime.timedelta(hours=8)

local_date_str = datetime.datetime.strftime(local_date ,'%Y-%m-%d %H:%M:%S')
print(local_date_str )    # 2019-07-26 16:20:54

import datetime


utc = "2017-07-28T08:28:47.776Z"
UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
utc_time = datetime.datetime.strptime(utc, UTC_FORMAT)
local_time = utc_time + datetime.timedelta(hours=8)
print(local_time)    # 2017-07-28 16:28:47.776000
```

#### 使用Python标准库获取当前北京时间 (无需pytz)

* 中国（大陆、香港、澳门、台湾）、新加坡、马来西亚、文莱、菲律宾均使用UTC+08:00时间且不实施夏时制。
* 因此无需pytz库，使用Py此方法不受系统默认时区的影响。thon标准库即可计算当前时间及日期。
* 在时区信息数据库中，Asia/Shanghai代表北京时间（中国标准时间），因为上海是人口最多的城市。

```python
from datetime import datetime
from datetime import timedelta
from datetime import timezone

SHA_TZ = timezone(
    timedelta(hours=8),
    name='Asia/Shanghai',
)



# 协调世界时
utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)
print(utc_now, utc_now.tzname())
print(utc_now.date(), utc_now.tzname())



# 北京时间
beijing_now = utc_now.astimezone(SHA_TZ)
print(beijing_now, beijing_now.tzname())
print(beijing_now.date(), beijing_now.tzname())



# 系统默认时区
local_now = utc_now.astimezone()
print(local_now, local_now.tzname())
print(local_now.date(), local_now.tzname())
计算结果

2020-05-01 11:31:20.692283+00:00 UTC
2020-05-01 UTC
2020-05-01 19:31:20.692283+08:00 Asia/Shanghai
2020-05-01 Asia/Shanghai
2020-05-01 21:31:20.692283+10:00 AEST
2020-05-01 AEST
```
