Discuss / Python / Notes

Notes

Topic source

Nathan_Hu_

#1 Created at ... [Delete] [Delete and Lock User]

datetime

datetime 是处理日期和时间的标准库。

datetime 表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。

如果要存储 datetime ,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。

获取当前的日期和时间

  • datetime.now()
>>> from datetime import datetime  # from 模块 import 类
>>> now = datetime.now()  # 类.now()
>>> now
datetime.datetime(2017, 12, 3, 20, 58, 26, 444187)
>>> print(now)
2017-12-03 20:58:26.444187
# print() 和直接返回对象分别调用了不同的方法(__str__、__repr__),所以不一样。
>>> type(now)
<class 'datetime.datetime'>

获取指定日期和时间

  • datetime(a, b, c, d, e, f)
>>> from datetime import datetime
# 直接创建一个 datetime 对象
>>> dt = datetime(2015, 4, 19, 12, 20)
>>> print(dt)
2015-04-19 12:20:00

datetime => timestamp

在计算机中,时间实际上是用数字表示的。

我们把<u>1970年1月1日 00:00:00 UTC+00:00</u> 时区的时刻称为 epoch time ,记为0 (1970年以前的时间 timestamp 为负数),当前时间就是相对于 epoch time 的秒数,称为 timestamp

  • timestamp()
>>> from datetime import datetime
>>> now = datetime.now()
>>> now.timestamp()
1512306675.826184  # 1970年1月1日0时距离此刻的秒数。

timestamp => datetime

  • datetime.fromtimestamp()
  • datetime.utcfromtimestamp()
>>> from datetime import datetime
>>> tt = 142941720.15
>>> dt = datetime.fromtimestamp(tt)  # 本地时间
>>> print(dt)
1974-07-13 18:02:00.150000

将 timestamp 转换到UTC标准时区的时间:

# 接上
>>> dtu = datetime.utcfromtimestamp(tt)  # UTC时间
>>> print(dtu)
1974-07-13 10:02:00.150000
# UTC时间,即格林威治标准时间,比北京时间(UTC+8:00)早了8小时。

str => datetime

  • datetime.strptime()
>>> from datetime import datetime
>>> t_str = '2015-6-1 18:19:59'
>>> dt = datetime.strptime(t_str, '%Y-%m-%d %H:%M:%S')
>>> print(dt)
2015-06-01 18:19:59
>>> type(dt)
<class 'datetime.datetime'>

注: 转换后的 datetime 也是没有时区信息的。

datetime => str

  • datetime.strftime()
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2017-12-03 21:43:36.897875
>>> t_str = now.strftime('%m/%d/%Y %H:%M:%S')
>>> t_str
'12/03/2017 21:43:36'

datetime 加减

  • timedelta()
  • 直接加减 datetime 对象
>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> print(now)
2017-12-04 15:08:43.441170

# 方法一:
>>> print(now + timedelta(hours=10))
2017-12-05 01:08:43.441170
>>> print(now + timedelta(days=2, hours=12))
2017-12-07 03:08:43.441170

# 方法二:
>>> birth = datetime(1992, 12, 17)
>>> print(now - birth)
9118 days, 15:08:43.441170

本地时间转换为 UTC 时间

默认情况下,通过 datetime 创建时间日期对象是不包括时区信息的;这里是想给 datetime 对象加上时区信息。

  • timezone()
  • timeinfo
>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> >>> tz_utc_8
datetime.timezone(datetime.timedelta(0, 28800))
>>> print(tz_utc_8)
UTC+08:00

>>> now = datetime.now()
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2017, 12, 4, 15, 19, 38, 862724, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
>>> print(dt)
2017-12-04 15:19:38.862724+08:00

时区转换

  • astimezone()
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
# utcnow() 可以获得此刻的格林威治标准时间,但也不包含时区信息。
>>> print(utc_dt)
2017-12-04 07:38:52.990177+00:00

# 将带时区信息的格林威治标准时间转换为北京时间
>>> beijing_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(beijing_dt)
2017-12-04 15:38:52.990177+08:00

# 将带时区信息的北京时间转换为东京时间
>>> tokyo_dt = beijing_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2017-12-04 16:38:52.990177+09:00

  • 1

Reply