Python --datetime模块

目录

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的内置模块, 直接导入即可使用

1, 获取datetime时间

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)

2, datetime与timestamp转换

2-1, datetime转timestamp

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

2-2, timestamp转datetime

# 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)

3, str格式与datetime转换

3-1, datetime转str格式

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'

3-2, str格式转datetime

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)

4, datetime运算

4-1, datetime之间运算

datetime之间支持之间相减,不支持相加


# datetime之间相减
In [199]: datetime.now() - datetime(2023,1,1)
Out[199]: datetime.timedelta(days=240, seconds=62056, microseconds=554334)

4-2, 通过timedelta加减

使用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)

5, 时区转换

5-1, 本地时间转换为UTC时间

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)))

5-2, 时区间转换

# 通过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)

6, 带时区datetime转换为timestamp

这样的好处在于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

你可能感兴趣的:(python,python)