datetime 是处理日期和时间的标准库。
datetime
datetime 表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。
如果要存储 datetime ,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。
>>> 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'>
>>> from datetime import datetime # 直接创建一个 datetime 对象 >>> dt = datetime(2015, 4, 19, 12, 20) >>> print(dt) 2015-04-19 12:20:00
在计算机中,时间实际上是用数字表示的。
我们把<u>1970年1月1日 00:00:00 UTC+00:00</u> 时区的时刻称为 epoch time ,记为0 (1970年以前的时间 timestamp 为负数),当前时间就是相对于 epoch time 的秒数,称为 timestamp 。
epoch time
0
timestamp
>>> from datetime import datetime >>> now = datetime.now() >>> now.timestamp() 1512306675.826184 # 1970年1月1日0时距离此刻的秒数。
>>> 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小时。
>>> 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 也是没有时区信息的。
>>> 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'
>>> 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
默认情况下,通过 datetime 创建时间日期对象是不包括时区信息的;这里是想给 datetime 对象加上时区信息。
>>> 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
>>> 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
Sign in to make a reply
Nathan_Hu_
datetime
datetime
是处理日期和时间的标准库。datetime
表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。如果要存储
datetime
,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。获取当前的日期和时间
获取指定日期和时间
datetime => timestamp
在计算机中,时间实际上是用数字表示的。
我们把<u>1970年1月1日 00:00:00 UTC+00:00</u> 时区的时刻称为
epoch time
,记为0
(1970年以前的时间 timestamp 为负数),当前时间就是相对于 epoch time 的秒数,称为timestamp
。timestamp => datetime
将 timestamp 转换到UTC标准时区的时间:
str => datetime
注: 转换后的 datetime 也是没有时区信息的。
datetime => str
datetime 加减
本地时间转换为 UTC 时间
默认情况下,通过 datetime 创建时间日期对象是不包括时区信息的;这里是想给 datetime 对象加上时区信息。
时区转换