基础知识
时间格式有哪些?
- 「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)以伦敦格林威治的子午线为基线,以地球自转为标准,全球都以此标准设定时间。
- 世界协调时(Coordinated Universal Time,简称UTC)又称世界标准时间或世界协调时间,是最主要的世界时间标准,在时刻上尽量接近于格林尼治标准时间。对于大多数用途来说,UTC时间被认为能与GMT时间互换,基本相等,但GMT时间已不再被科学界所确定
- 中国标准时间(CST):中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8
- ISO 8601 标准时间:在 ISO 8601 的表示中,日期和时间按照这样的顺序排列:大的单位(比如年)放在左边,小的单位依次往右排列。表示只能由阿拉伯数字和指定的特殊字符(比如"-“, “:”, “T”, “W”, “Z”)等组成,这样的话,日常常用的描述性的单词(比如"January”, “Thursday”, or “New Year’s Day”)是不允许使用的
Python中的时间格式化
日期时间格式是指转为字符串时的格式化,可以自定义,有很多种,常见的有
- UTC时间格式:“yyyy-mm-ddThh:mm:ssZ”,在Python中是"%Y-%m-%dT%H:%M:%SZ"
- 本地时间格式:“yyyy-mm-dd hh:mm:ss”,在Python中是"%Y-%m-%d %H:%M:%S"
- 汉字表示格式:“yyyy年mm月dd日 hh时mm分ss秒”,在Python中是“%Y年%m月%d日 %H时%M分%S秒”
指令 |
含意 |
示例 |
备注 |
|
当地工作日的缩写。 |
Sun, Mon, ..., Sat (en_US); So, Mo, ..., Sa (de_DE) |
(1) |
|
本地化的星期中每日的完整名称。 |
Sunday, Monday, ..., Saturday (en_US); Sonntag, Montag, ..., Samstag (de_DE) |
(1) |
|
以十进制数显示的工作日,其中0表示星期日,6表示星期六。 |
0, 1, ..., 6 |
|
|
补零后,以十进制数显示的月份中的一天。 |
01, 02, ..., 31 |
(9) |
|
当地月份的缩写。 |
Jan, Feb, ..., Dec (en_US); Jan, Feb, ..., Dez (de_DE) |
(1) |
|
本地化的月份全名。 |
January, February, ..., December (en_US); Januar, Februar, ..., Dezember (de_DE) |
(1) |
|
补零后,以十进制数显示的月份。 |
01, 02, ..., 12 |
(9) |
|
补零后,以十进制数表示的,不带世纪的年份。 |
00, 01, ..., 99 |
(9) |
|
十进制数表示的带世纪的年份。 |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(2) |
|
以补零后的十进制数表示的小时(24 小时制)。 |
00, 01, ..., 23 |
(9) |
|
以补零后的十进制数表示的小时(12 小时制)。 |
01, 02, ..., 12 |
(9) |
|
本地化的 AM 或 PM 。 |
AM, PM (en_US); am, pm (de_DE) |
(1), (3) |
|
补零后,以十进制数显示的分钟。 |
00, 01, ..., 59 |
(9) |
|
补零后,以十进制数显示的秒。 |
00, 01, ..., 59 |
(4), (9) |
|
微秒作为一个十进制数,零填充到 6 位。 |
000000, 000001, ..., 999999 |
(5) |
|
UTC 偏移量,格式为 |
(空), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
时区名称(如果对象为简单型则为空字符串)。 |
(空), UTC, GMT |
(6) |
|
以补零后的十进制数表示的一年中的日序号。 |
001, 002, ..., 366 |
(9) |
|
以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。 |
00, 01, ..., 53 |
(7), (9) |
|
以补零后的十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个星期一之前的所有日子都被视为是在第 0 周。 |
00, 01, ..., 53 |
(7), (9) |
|
本地化的适当日期和时间表示。 |
Tue Aug 16 21:30:00 1988 (en_US); Di 16 Aug 21:30:00 1988 (de_DE) |
(1) |
|
本地化的适当日期表示。 |
08/16/88 (None); 08/16/1988 (en_US); 16.08.1988 (de_DE) |
(1) |
|
本地化的适当时间表示。 |
21:30:00 (en_US); 21:30:00 (de_DE) |
(1) |
|
字面的 |
% |
时间戳
时间戳一般指的是Unix时间/POSIX时间,从1970-01-01 00:00:00到当前的秒数,一般使用10位或13位表示
datetime
date
属性(只读)
- year:int类型,如2023
- month:int类型,如2
- day::int类型,如21
方法
- today:返回当前日期,转字符串使用iso格式,例如 2023-02-21
- fromtimestamp:从时间戳返回当地时间
- replace:返回一个date,可以通过参数修改year month day,会进行检查,不符合抛异常ValueError
- strftime:按照格式返回字符串
datetime
属性(只读)
- year:int类型,如2023
- month:int类型,如2
- day:int类型,如21
- hour:int类型,小时
- minute:int类型,分钟
- second:int类型,秒
- microsecond:int类型,毫秒
方法
- today、now:返回本地当前日期时间,例如,2023-02-21 21:09:07.915277
- utcnow:返回utc时间,即北京时间的8个小时前
- timestamp
- fromtimestamp:从时间戳获取本地时间
- utcfromtimestamp:从时间戳获取utc时间
- date:返回日期对象
- time:返回时间对象
- replace:返回一个datetime对象,可通过参数修改,会进行检查,不符合抛异常ValueError
- strftime:按照格式返回字符串
- strptime:返回一个对应于 date_string,根据 format 进行解析得到的 datetime 对象。
timedelta
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 用于表示两个时间的间隔
用这个就比较方便,比如,计算昨天,自己写的话还要考虑月份的天数,这个直接减去即可
time
方法
- time:返回时间戳,float类型
- localtime:获得时间元组,secs参数可选,接受float
- mktime:这是 localtime() 的反函数,时间参数t,返回对应的一个float值
- sleep:程序睡眠,secs参数代表睡眠秒数
- strftime:返回指定format格式的字符串,t参数可选,默认为localtime返回的值
- strptime:将string按照指定格式解析,返回一个时间元组
常用
我们常常收到和发送的都是字符串,这里就以字符串处理为例
获取今天凌晨字符串?
def get_today_format(format="%Y-%m-%d 00:00:00"): str_time = datetime.today().strftime(format) return str_time
默认返回今天凌晨的字符串,可以修改格式
将一个时间格式的字符串转为时间戳
def get_time_stamp(str_time,format="%Y-%m-%dT%H:%M:%SZ") -> float: s_t = time.strptime(str_time,format) mkt = time.mktime(s_t) * 1000 return mkt def get_date_time_stamp(str_time,format="%Y-%m-%dT%H:%M:%SZ") -> float: date_time = datetime.strptime(str_time,format) time_stamp = date_time.timestamp()*1000 return time_stamp
将一个时间戳转为指定格式的字符串
def get_str_by_timestamp(timestamp=time.time(),format="%Y-%m-%d %H:%M:%S"): time_tuple = time.localtime(float(timestamp)) str_time = time.strftime(format,time_tuple) return str_time
将一个utc字符串转为本地时间格式字符串(2023-04-01新增)
def utc_str_to_local_str(utc_str:str,utc_format="%Y-%m-%dT%H:%M:%SZ",local_format="%Y-%m-%d %H:%M:%S") -> str: utc_time = datetime.strptime(utc_str,utc_format) utc_time += timedelta(hours=8) local_str = datetime.strftime(utc_time,local_format) return local_str
全部代码
from datetime import date,datetime,timedelta import time local_format = "%Y-%m-%d %H:%M:%S" utc_format = "%Y-%m-%dT%H:%M:%SZ" chinese_format = "%Y年%m月%d日 %H时%M分%S秒" def date_test(): year,month,day = date.today().year,date.today().month,date.today().day print(type(year),year,month,day) today = date.today() print(type(today), str(today)) timestamp = date.today().fromtimestamp(datetime.now().timestamp()) print(timestamp) today_but_28 = date.today().replace(day=28) print(today_but_28) today_format = today.strftime("%Y/%m/%d") print(today_format) date_time_format = datetime.strptime(today_format,"%Y/%m/%d") print(date_time_format) def datetime_test(): today,now = datetime.today(),datetime.now() print(type(today),today,now) year,month,day= now.year,now.month,now.day hour, minute, second = now.hour,now.minute,now.second print(type(year),year,month,day) print(type(hour),hour,minute,second) utcnow = datetime.utcnow() print(utcnow) date,time = now.date(),now.time() print(type(date),date) print(type(time),time) today_but_28 = now.replace(day=28,minute=59) print(today_but_28) today_format = now.strftime("%Y/%m/%d %H:%M:%S") print(today_format) def time_delta_test(): one_day,one_hour = timedelta(days=1),timedelta(hours=1) yesterday_same_time = datetime.now() - one_day one_hour_later = datetime.now() + one_hour print(yesterday_same_time) print(one_hour_later) def time_test(): time_stamp_float = time.time() print(time_stamp_float) s = time.localtime(time_stamp_float) print(s) time_float = time.mktime(s) print(time_float) local_str = time.strftime(local_format) print(local_str) default_format_time = time.strptime(local_str,local_format) print(default_format_time) time.sleep(1) def get_today_format(format="%Y-%m-%d 00:00:00"): str_time = datetime.today().strftime(format) return str_time def get_time_stamp(str_time,format="%Y-%m-%dT%H:%M:%SZ") -> float: s_t = time.strptime(str_time,format) mkt = time.mktime(s_t) * 1000 return mkt def get_date_time_stamp(str_time,format="%Y-%m-%dT%H:%M:%SZ") -> float: date_time = datetime.strptime(str_time,format) time_stamp = date_time.timestamp()*1000 return time_stamp def get_str_by_timestamp(timestamp=time.time(),format="%Y-%m-%d %H:%M:%S"): time_tuple = time.localtime(float(timestamp)) str_time = time.strftime(format,time_tuple) return str_time def utc_str_to_local_str(utc_str:str,utc_format="%Y-%m-%dT%H:%M:%SZ",local_format="%Y-%m-%d %H:%M:%S") -> str: utc_time = datetime.strptime(utc_str,utc_format) utc_time += timedelta(hours=8) local_str = datetime.strftime(utc_time,local_format) return local_str def main(): # date_test() # datetime_test() # time_delta_test() # time_test() # print(get_today_format()) # print(get_time_stamp('2023-02-17T11:30:52Z')) # print(get_date_time_stamp('2023-02-17T11:30:52Z')) # print(get_str_by_timestamp()) print(utc_str_to_local_str("2023-02-17T19:30:52Z")) if __name__ == '__main__': main()
截图如下:
思考:
- 使用datetime包完成 将一个时间戳转为指定格式的字符串
- 如何写一个函数,获取当前本地时间减去一个时间间隔的utc格式的字符串?
- 如何写一个函数,将时间格式字符串转为另一时间格式字符串?