目录
1, 获取datetime时间
2, datetime与timestamp转换
2-1, datetime转timestamp
2-2, timestamp转datetime
3, str格式与datetime转换
3-1, datetime转str格式
3-2, str格式转datetime
4, datetime运算
4-1, datetime之间运算
4-2, 通过timedelta加减
5, 时区转换
5-1, 本地时间转换为UTC时间
5-2, 时区间转换
6, 带时区datetime转换为timestamp
datetime是python的内置模块, 直接导入即可使用
In [59]: from datetime import datetime
# 当前时间转换为datetime格式
In [60]: now = datetime.now()
In [61]: now
Out[61]: datetime.datetime(2023, 8, 29, 21, 58, 51, 671852)
# 设置一个datetime时间
In [64]: dt = datetime(2023, 8, 29, 22, 1, 10)
In [65]: dt
Out[65]: datetime.datetime(2023, 8, 29, 22, 1, 10)
In [92]: from datetime import datetime
In [93]: now = datetime.now()
# 获取当前系统时间的datetime
In [94]: now
Out[94]: datetime.datetime(2023, 8, 29, 15, 46, 41, 445550)
# datetime转换为timestamp
In [96]: now.timestamp()
Out[96]: 1693295201.44555
# timestamp转换为datetime
In [80]: t = datetime.now().timestamp()
In [81]: t
Out[81]: 1693317944.383471
In [82]: datetime.fromtimestamp(t)
Out[82]: datetime.datetime(2023, 8, 29, 22, 5, 44, 383471)
# 转换为标准的utc的datetime
In [84]: datetime.utcfromtimestamp(t)
Out[84]: datetime.datetime(2023, 8, 29, 14, 5, 44, 383471)
datetime转换为str,使用的方法是strftime()
# 获取时间的datetime格式
In [85]: now = datetime.now()
In [86]: now
Out[86]: datetime.datetime(2023, 8, 29, 22, 8, 32, 807460)
# datetime格式转换为字符串格式
In [87]: now.strftime('%Y-%m-%d %H:%M:%S')
Out[87]: '2023-08-29 22:08:05'
格式化字符:
%a:星期英文格式缩写
In [134]: datetime.now().strftime('%a')
Out[134]: 'Tue'
%A:星期英文格式全写
In [135]: datetime.now().strftime('%A')
Out[135]: 'Tuesday'
%w:星期数字格式
In [136]: datetime.now().strftime('%w')
Out[136]: '2'
%d:数字格式当月号数
# 当月29号
In [137]: datetime.now().strftime('%d')
Out[137]: '29'
%b:月份英文格式缩写
In [138]: datetime.now().strftime('%b')
Out[138]: 'Aug'
%B:月份英文格式全写
In [139]: datetime.now().strftime('%B')
Out[139]: 'August'
%m:月份数字格式
In [140]: datetime.now().strftime('%m')
Out[140]: '08'
%y:年份,仅显示后两位
# 表示23年
In [141]: datetime.now().strftime('%y')
Out[141]: '23'
%Y:年份,显示所有
In [142]: datetime.now().strftime('%Y')
Out[142]: '2023'
%H:24小时制显示小时
# 表示是16点钟
In [143]: datetime.now().strftime('%H')
Out[143]: '16'
%I:12小时制显示小时
# 表示四点钟
In [144]: datetime.now().strftime('%I')
Out[144]: '04'
%p:回显pm或am
In [146]: datetime.now().strftime('%p')
Out[146]: 'PM'
%M:分钟数
In [147]: datetime.now().strftime('%M')
Out[147]: '31'
%S:秒数
In [148]: datetime.now().strftime('%S')
Out[148]: '41'
%f:毫秒数
In [149]: datetime.now().strftime('%f')
Out[149]: '953566'
%j:表示当前是今年的第多少天
# 本年第241天
In [152]: datetime.now().strftime('%j')
Out[152]: '241'
%U:当年的第多少周(星期天作为一周第一天)
# 本年的第35周
In [153]: datetime.now().strftime('%U')
Out[153]: '35'
%w:当年的第多少周(星期一作为一周第一天)
# 本年第35周
In [155]: datetime.now().strftime('%W')
Out[155]: '35'
%c:英文格式的日期时间格式
In [160]: datetime.now().strftime('%c')
Out[160]: 'Tue Aug 29 16:42:30 2023'
%X:时间格式, 以“:”分割
In [161]: datetime.now().strftime('%X')
Out[161]: '16:43:00'
%x:日期格式,以反斜杠分割
In [162]: datetime.now().strftime('%x')
Out[162]: '08/29/23'
str格式的时间转换为datetime使用strptime方法
In [89]: str_time = '2023-08-29 22:08:32'
In [90]: datetime.strptime(str_time, '%Y-%m-%d %H:%M:%S')
Out[90]: datetime.datetime(2023, 8, 29, 22, 8, 32)
datetime之间支持之间相减,不支持相加
# datetime之间相减
In [199]: datetime.now() - datetime(2023,1,1)
Out[199]: datetime.timedelta(days=240, seconds=62056, microseconds=554334)
使用timedelta需要先导入:from datetime import timedelta
In [200]: from datetime import timedelta
# 加3天
In [201]: datetime.now() + timedelta(days=3)
Out[201]: datetime.datetime(2023, 9, 1, 17, 16, 36, 897620)
# 减3天
In [203]: datetime.now() - timedelta(days=3)
Out[203]: datetime.datetime(2023, 8, 26, 17, 16, 46, 674351)
# 加3小时
In [204]: datetime.now() + timedelta(hours=3)
Out[204]: datetime.datetime(2023, 8, 29, 20, 16, 53, 746510)
# 减3小时
In [205]: datetime.now() - timedelta(hours=3)
Out[205]: datetime.datetime(2023, 8, 29, 14, 16, 57, 10485)
# 加3分钟
In [206]: datetime.now() + timedelta(minutes=3)
Out[206]: datetime.datetime(2023, 8, 29, 17, 20, 11, 881435)
# 减3分钟
In [207]: datetime.now() - timedelta(minutes=3)
Out[207]: datetime.datetime(2023, 8, 29, 17, 14, 15, 66273)
In [247]: from datetime import datetime, timedelta, timezone
# 创建UTC-8时区
In [248]: tz_utc_8 = timezone(timedelta(hours=8))
In [249]: now = datetime.now()
In [250]: now
Out[250]: datetime.datetime(2023, 8, 29, 21, 10, 10, 583383)
# 本地时间转换为UTC时间, tzinfo为时区属性
In [251]: dt = now.replace(tzinfo=tz_utc_8)
In [252]: dt
Out[252]: datetime.datetime(2023, 8, 29, 21, 10, 10, 583383, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
# 通过datetime.utcnow()获取utc时间,并设置为UTC0
In [38]: utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
In [39]: utc_dt
Out[39]: datetime.datetime(2023, 8, 29, 13, 40, 24, 247748, tzinfo=datetime.timezone.utc)
# UTC0时区转换到UTC8时区
In [41]: bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
In [42]: bj_dt
Out[42]: datetime.datetime(2023, 8, 29, 21, 40, 24, 247748, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
# UTC8时区转换到UTC9时区
In [43]: dj_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
In [44]: dj_dt
Out[44]: datetime.datetime(2023, 8, 29, 22, 40, 24, 247748, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)
# 时区间转换
In [45]: bj_dt.astimezone(timezone(timedelta(hours=9)))
Out[45]: datetime.datetime(2023, 8, 29, 22, 40, 24, 247748, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)
这样的好处在于timestamp和时区没有关系,达到正确存储的作用
import re
from datetime import datetime, timezone, timedelta
def datetime_to_timestamp(str_time, time_zone):
dt = datetime.strptime(str_time, '%Y-%m-%d %H:%M:%S')
# 将dt的时区替换为指定的时区
dt_utc = dt.replace(tzinfo=timezone(timedelta(hours=int(re.search(r'[+-]\d+', time_zone).group()))))
result = dt_utc.timestamp()
return result
if __name__ == "__main__":
t1 = datetime_to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
assert t1 == 1433121030.0, t1
t2 = datetime_to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
assert t2 == 1433121030.0, t2