Pyhton--日期与时间

日期和时间模块

  •  time 和 calendar 模块可以用于格式化日期和时间,time模块下有很多函数可以转换日期。
  • time.time() 返回当前时间戳 浮点数
  • localtime() 将时间戳返回 时间元组    struct_time类  
  •  

    •  
time.localtime(time.time()) 输出 time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=28, tm_sec=49, tm_wday=3, tm_yday=98, tm_isdst=0)
序号
属性
0
tm_year
2008
1
tm_mon
1 到 12
2
tm_mday
1 到 31
3
tm_hour
0 到 23
4
tm_min
0 到 59
5
tm_sec
0 到 61 (60或61 是闰秒)
6
tm_wday
0到6 (0是周一)
7
tm_yday
一年中的第几天,1 到 366
8
tm_isdst
是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1
 
  • time.asctime() 函数, 将时间元祖转为简单的可读格式。

# localtime()  时间戳转时间元组   time()获取当前时间戳
    localtime = time.localtime(time.time())

    print(type(localtime))  # <class 'time.struct_time'>

    print(localtime.tm_year)  # 2022

    print(localtime[0])  # 2022

    # mktime()  时间元组转时间戳

    mktime = time.mktime(localtime)

    print(mktime)  # 1642299718.0

    # asctime() 将时间元祖转为简单的可读格式

    asctime = time.asctime(localtime)

    print(asctime)  # Sat Jan 15 21:37:16 2022

    # strftime() 将时间元组格式化输出字符串,不填默认当前

    strftime1 = time.strftime("%Y-%m-%d %H:%M:%S", localtime)

    print(strftime1)

    # strptime()  将格式化的字符串转为时间元组

    strptime1 = time.strptime("Sun Jan 16 10:06:32 2022", "%a %b %d %H:%M:%S %Y")

    print(strptime1)

    # sleep()   线程睡眠

    time.sleep(1.5)

    # perf_counter() 返回系统运行时间,由于基准点未定义,只有连续调用的差值是有效的。

    print(time.perf_counter())  # 213492.5056599

    time.sleep(3.33)

    print(time.perf_counter())  # 213495.8365289

    # process_time() 返回进程运行时间,由于基准点未定义,只有连续调用的差值是有效的。

    print(time.process_time())

 

 
    #进度条实例
  scale = 50

    print("执行开始".center(scale // 2, "-"))  # .center() 控制输出的样式,宽度为 25//2,即 22,汉字居中,两侧填充 -

    start = time.perf_counter()  # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。
    for i in range(scale + 1):
        a = '*' * i  # i 个长度的 * 符号
        b = '.' * (scale - i)  # scale-i) 个长度的 . 符号。符号 * 和 . 总长度为50
        c = (i / scale) * 100  # 显示当前进度,百分之多少
        dur = time.perf_counter() - start  # 计时,计算进度条走到某一百分比的用时
        print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur),
              end=''# \r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{},对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。
        time.sleep(0.1)  # 在输出下一个百分之几的进度前,停止0.1秒
    print("\n" + "执行结果".center(scale // 2, '-'))

 

  • Calendar模块
  • 星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数
序号
函数及描述
1
calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
2
calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
3
calendar.isleap(year)

是闰年返回 True,否则为 false。

>>> import calendar >>> print(calendar.isleap(2000))True>>> print(calendar.isleap(1900))False
4
calendar.leapdays(y1,y2) 返回在Y1,Y2两年之间的闰年总数。
5
calendar.month(year,month,w=2,l=1) 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
6
calendar.monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
7
calendar.monthrange(year,month)

返回两个整数。第一个是该月的星期几,第二个是该月有几天。星期几是从0(星期一)到 6(星期日)。

>>> import calendar >>> calendar.monthrange(2014, 11)(5, 30)

(5, 30)解释:5 表示 2014 年 11 月份的第一天是周六,30 表示 2014 年 11 月份总共有 30 天。

8
calendar.prcal(year, w=0, l=0, c=6, m=3) 相当于 print (calendar.calendar(year, w=0, l=0, c=6, m=3))。
9
calendar.prmonth(theyear, themonth, w=0, l=0) 相当于 print(calendar.month(theyear, themonth, w=0, l=0))。
10
calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。
11
calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
12
calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。
  • datetime模块
  • 注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。
  • 如果仅导入import datetime,则必须引用全名datetime.datetime。

  • 创建datetime对象,now() utcnow()或者datetime(),datetime.now()返回当前日期和时间,其类型是datetime对象。或者datetime(2022,1,14,12,55)

  • 将datetime对象转时间戳,datetime.timestamp(dt) 或 dt.timestamp()

  • fromtimestamp()  utcfromtimestamp() 时间戳转datetime对象,默认本地时间时区

  • strptime()  将格式化字符转为datetime对象,转换没有时区

  • datetime加减得到新的datetime对象,需导入timedelta类

  • #时区转换,一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区

  • #时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。

  • #利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

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

  • astimezone() 进行时区转换

now = datetime.now()
print(now)
print(type(now)) #<class 'datetime.datetime'>
dt = datetime(2022,1,14,11,55) #构造一个datetime对象,时区不设置默认None本地时间
print(dt)
print(type(dt)) #<class 'datetime.datetime'>

#  timestamp() 转时间戳
ts = dt.timestamp()
print(datetime.timestamp(dt))
print(ts)

#  fromtimestamp()  utcfromtimestamp() 时间戳转datetime对象,默认本地时间时区
print(datetime.fromtimestamp(ts))
print(datetime.utcfromtimestamp(ts))

# strptime()  将格式化字符转为datetime对象,转换没有时区
print(datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S'))
# strftime()  将datetime对象转为格式化字符串
print(dt.strftime("%Y--%m--%d %H:%M:%S"))

# datetime加减得到新的datetime对象,需导入timedelta类,
print(dt + timedelta(hours=7))
print(dt - timedelta(days=2,hours=6))


#时区转换,一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区
#时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。
#利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

# 创建一个时区
tz_utc_8 = timezone(timedelta(hours=8))
# 强制设置时区为utf8,如果系统时间正确才可以这样设置
print(datetime.now().replace(tzinfo=tz_utc_8))
# 拿到UTC时间,并强制设置时区为UTC+0:00:
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
# astimezone() 进行时区转换
print(utc_dt.astimezone(timezone(timedelta(hours=8))))
print(utc_dt.astimezone(timezone(timedelta(hours=9))))
print(utc_dt.astimezone(timezone(timedelta(hours=4))))

 

posted @ 2022-01-16 20:14  之间。  阅读(44)  评论(0编辑  收藏  举报