欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

时间处理模块time

程序员文章站 2024-01-22 07:59:40
...

一、时间概念

1.1 时间戳  

  时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总
  秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

1.2 时区

  为了时间各国的时间能统一,使用了时区的概念。以格林尼治为0时区,总24个时区。 东+,西-

1.3 夏令时

  为了节约夏天的能源,开发出来的一个调节时间。 然后实际证明没什么软用。 中国以前也用过,但是取消掉了。

二、python代码中的时间

  时间有三种格式:

      时间戳(timestamp)

      时间字符串(Format String)

      结构化的时间(struct_time):(year=2018, month=5, day=1, hour=16, min=37, sec=6)

  python中的时间模块

      time

      datetime

      python-dateutil (pip install)  

2.1 time 模块

  常用方法:

    time.time()   当前的时间戳

    time.sleep()   停止多少时间

2.1.1 时间戳 与 结构化时间 之间相互转换

import time
print(time.localtime()) # 无参数的时候,表示取当前时间
print(time.localtime(0)) # 0时间戳,在中国是 70年8点
print(time.mktime(time.localtime()))

2.1.2 结构化时间 与 格式化字符串时间 相互转换

一、  strftime : tuple -> 字符串时间

  strftime(format[, tuple]) -> string

两个参数:

    format:我们定义的格式

    tuple为可选参数,不写的时候,使用当前的时间。

  format的字符:

%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
>>> time.strftime('%Y-%m-%d %X', time.localtime())

'2018-06-24 13:14:35'

二 、 字符串时间 到 结构化时间转换

    strptime(string, format) -> struct_time

    把一个时间的字符串,按照格式进行转化

time.strptime('2018-05-06 22:52:40', "%Y-%m-%d %X")

2.1.3 结构化时间和时间戳 到 固定字符串时间的转换

  字符串时间的格式固定

# 结构化时间 到 固定字符串时间
>>> time.asctime()
'Sun Jun 24 13:40:09 2018'
>>> time.asctime(time.localtime(0))
'Thu Jan 1 08:00:00 1970'

# 时间戳 到 固定字符串时间
>>> time.ctime()
'Sun Jun 24 13:40:39 2018'
>>> time.ctime(0)
'Thu Jan 1 08:00:00 1970'

2.2 datetime 模块

datetime包含的模块如何:

  date 日期模块 包含年 月 日
  time 时间模块 包含时 分 秒 微秒
  datetime 日期时间模块 包含了时间全部东西
  timedelta 日期计算模块

2.2.1 date模块

  只包含日期

a = datetime.date(2018, 11, 11) # 生成一个date对象
print(a.year, a.month, a.day)
from datetime import date
date.today()
print(a.today())
a.year
a.mouth
a.day

2.2.2 time模块

  只包含时间

a = datetime.time(12, 23, 24, 12) # 生成一个时间对象,包含了时分秒
print(a)
a.hour
a.minute
a.second
print(a.microsecond)

2.2.3 datetime模块

  包含日期与时间

# datetime类

a = datetime.datetime.now() # 获取当前时间的datetime类
b = datetime.datetime(2018, 2, 19, 12, 15) # 自己生成一个datetime对象

# 字符串格式化,使用Y m d等提取datetime对象中相对应的参数
c = '{dt:%Y-%m-%d %H}'.format(dt=datetime.datetime.now())
c = f'{datetime.datetime.now():%Y-%m-%d}'
print(c)

时间戳 转 datatime对象

# 时间戳 转 datime对象
import time
from datetime import datetime
a = time.time()
print('a', datetime.utcfromtimestamp(0))
print('a', datetime.utcfromtimestamp(a))
datetime 与 字符串时间之间的转换

格式化字符串表示时间

# 格式化字符串表示时间
# strftime: % -> 1999-12-12, 把代码里面的时间对象转成人类认识的字符串,f:format
# strptime: 2000-12-12 -> object,把人类认识的字符串,转成代码里面的对象,p,parse
dt = datetime(2018,12,12,12,12)
print(dt.strftime('%Y-%m-%d %X'))
print(dt.strftime('%A %B %Y'))

f = dt.strptime('2018-12-12 12:12:00', '%Y-%m-%d %X') # 生成一个新的dt对象
fb = dt.strptime('Wednesday December 2018', '%A %B %Y')
print(fb, type(fb))

2.2.4 timedelta 计算模块

# 时间的计算
from datetime import timedelta
from datetime import date
a = timedelta(days=1)
# timedelta(hours=12)
today = date.today()
future = today + a*10
print(future, type(future))

c = future - today
print(c, type(c))

2.3 relativedelta 时间间隔模块

在处理跨年,跨天,跨月等情况下,没法使用。 timedelta不是很好用。
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *  # 表示星期号 MO,TU.WE,TH.FR

d = datetime.now()
print(d)

# 最近的星期三
# 下一周的星期三
# 上一周的星期三
print(d + relativedelta(weekday=WE))
print(d + relativedelta(weekday=WE, weeks=+1))
print(d + relativedelta(weekday=WE, weeks=-1))

# 间隔多少天,多少月的某一天
from datetime import date
print('下月的今天',date(2018, 1, 30) + relativedelta(months=+1))
print(date(218,2,27) + relativedelta(days=10))
# days = 10  是相差10天
# day = 10 是这个月第10天

案列

案例1: 2B闹钟

掌握的技术
    1.简单的控制台驻留技术
    2.subprocess操作系统接口
import sys
import time
import random
import subprocess

def alert():
    set_time = input('设置时间08:00')

    print(f'闹钟设置为{set_time}')
    print('现在的时间是')
    run = True

    while run:
        t = time.localtime()
        fmt = "%H:%M:%S"
        now = time.strftime(fmt, t)
        # print(now)
        print(now + '\r', end='', flush=True)
        # \r 是光标还在当前行
        # flush 刷新
        sys.stdout.write(now + '\r')
        sys.stdout.flush()
        time.sleep(1)
        if now[:5] == set_time.ljust(5, '0'):
            subprocess.Popen(['start', '上学歌.mp3'], shell=True)
            run = not random_match()
            # if random_match():
            #     break

def random_match():
    """
    时间控制模块
    :return: 答对为True,错误Flase
    """
    try:
        a = random.randint(0,10)
        b = random.randint(0,10)
        answer = int(input(f'请输入 {a}+{b} 结果:'))
        if answer == a + b:
            return True
        else:
            return False
    except Exception as e:
        print(e)

def main():
    alert()
    # print(random_match())


if __name__ == '__main__':
    main()

案列2 : 时间转换包

  • 基础储备

from datetime import datetime
from dateutil import parser
'''
时间的返回格式
    datetime打印出来也类似字符串
    两种格式类似    
'''
d1 = '2018/1/2 13:00'
dt = datetime.strptime(d1, '%Y/%m/%d %H:%M')
print(dt, type(dt))
print(dt.strftime('%Y-%m-%d %X'))

'''
    使用parse一键转换格式,不再傻傻的拼凑格式
    多种字符串类型  转化为 datetime
'''
d1 = '2018-1 8 13:28'
# d1 = '2018年1月8号 13点28分'  # 无法识别中文
date2 = parser.parse(d1)
print('parse转换:', date2, type(date2))  # 直接是datetime对象

# 解决中文无法识别的问题 使用替换
d2 = '2018年1月8日 13:28'
d3 = d2.replace('年', '/').replace('月', '/').replace('日', '')
print(d3)

'''
替换时间
比如只给了 1.6、 如何拼凑出完整的时间
使用datetime的replace方法
'''
s = '1.6'
now = datetime.now()
my_time = now.replace(month=1,day=6)
print(my_time, type(my_time))
my_time.strftime('%Y-%m-%d %x')
  • 转化为函数

from datetime import datetime
from dateutil import parser

def change_datetime(dt):
    """转换日期时间格式到yyyy-mm-dd hh:mm:ss"""
    date1 = parser.parse(dt)
    return date1, date1.strftime('%Y-%m-%d %X')

def change_date_cn(dt: str):
    """转换中文格式的时间。比如'2019年8月9日 12:23'''"""
    date1 = dt.replace('年', '/').replace('月', '/').replace('日', '')
    return change_datetime(date1)

def change_datetime_num(dt):
    """转换'1.5'这种月日格式的时间,并添加当前的时间"""
    month, day = dt.split('.')
    now = datetime.now()
    my_time = now.replace(day=int(day), month=int(month))
    return my_time, my_time.strftime('%Y-%m-%d %X')

def main():
    # dt = '2018 1 1 12:34'
    # dt_time, str_time = change_datetime(dt)  # 使用元祖来接受
    # print(dt_time,type(dt_time))
    # print(str_time,type(str_time))
    # dt = '2019年8月9日 12:23'
    dt = '1.6'
    dt_time, dt_str =change_datetime_num(dt)
    print(dt_time,type(dt_time))
    print(dt_str,type(dt_str))




if __name__ == '__main__':
    main()

抽象成类


class TimeMaster:
    """时间转换大师"""
    def __init__(self, fmt='%Y-%m-%d %x'):
        """定义初始化函数"""
        self.__out_fmt = fmt

    def change_datetime(self, dt):
        """转换英文格式日期时间格式到yyyy-mm-dd hh:mm:ss"""
        date1 = parser.parse(dt)
        return date1, date1.strftime(self.__out_fmt)


    def change_date_cn(self, dt: str):
        """转换中文格式的时间。比如'2019年8月9日 12:23'''"""
        date1 = dt.replace('年', '/').replace('月', '/').replace('日', '')
        return change_datetime(date1)

    def change_datetime_num(self, dt):
        """转换'1.5'这种月日格式的时间,并添加当前的时间"""
        month, day = dt.split('.')
        now = datetime.now()
        my_time = now.replace(day=int(day), month=int(month))
        return my_time, my_time.strftime(self.__out_fmt)

    def set_fmt(self, new_fmt):
        """更改字符串的输出格式"""
        self.__out_fmt = new_fmt

def main():
    t = TimeMaster()
    dt = '2018 1 1 12:34'
    dt = '2019年8月9日 12:23'
    dt = '1.6'
    dt_time, str_time = t.change_datetime_num(dt)
    print(dt_time,type(dt_time))
    print(str_time,type(str_time))


if __name__ == '__main__':
    main()