Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148013
  • 博文数量: 51
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2020-12-30 16:49
文章分类
文章存档

2021年(48)

2020年(3)

我的朋友

分类: Python/Ruby

2021-01-08 15:21:21

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:**time**、**datetime**、**calendar**,这篇文章主要帮大家整理这三个模块比较常用的方法。


## 熟悉三个概念


### GMT


格林威治时间, 十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测, 观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间 。但是由于地球在椭圆轨道中运行速度不均匀,GMT时间会有误差,因此现在已不再作为标准时间使用。




>本期小编推送2021初学者一定会用到的Python资料,含有小编自己呕心沥血整理的免费书籍/视频/在线文档和编辑器/源代码,关于`Python`的安装qun:850973621






### UTC


协调时间时,又称:世界标准时间,其计算方法更加精确。如果本地时间比UTC时间快,例如中国、蒙古国、新加坡、马来西亚、菲律宾、澳大利亚西部的时间比UTC快8小时,就会写作UTC+8,俗称东8区。相反,如果本地时间比UTC时间慢,例如夏威夷的时间比UTC时间慢10小时,就会写作UTC-10,俗称西10区。


### DST(Daylight Saving Time)


夏令时间,在夏天,天亮的比较早,将时间全部调快一个小时,以达到提早使用日光的目的,从而削减灯光照明和耗电开支。中国也曾经实施过夏令时,但是因为不方便,于1992年暂停了夏令时,不过目前全世界还有几十个国家在使用夏令时。


## time


我整理了time的方法,发现其实time模块整体是围绕着三种状态来运转的,如下图所示:


[图片上传失败...(image-f69f41-1610090275616)]


其中三种状态对应的数据格式如下:


*   时间戳的格式是:1578373137.54444
*   时间元祖的格式是:time.struct*time(tm*year=2020, tm*mon=1, tm*mday=7, tm*hour=4, tm*min=58, tm*sec=57, tm*wday=1, tm*yday=7, tm*isdst=0),它其实就是对时间数据格式的描述。
*   格式化时间:2020-01-07 12:58:57 这个是根据我们传入的format格式来转换的。


### 常用方法


#### 将时间戳转为时间元祖


```
# 获取时间戳
time_stamp = time.time()
print(time_stamp)
# 将时间戳转为时间元祖,从1970年1月1日 0点0分计算
print(time.gmtime(time_stamp))
# 将时间戳转为时间元祖 ,本地时间,如果在中国就是从1970年1月1日 8点0分计算
local_time_tuple = time.localtime(time_stamp)
print(local_time_tuple)复制代码
```


这里需要注意:time.gmtime()是从UTC时间开始计算的,而time.localtime()是从当地时间开始计算的,比如:在中国是从UTC+8小时开始计算的,这是这两个方法主要的区别。


#### 将时间元祖转成时间戳


```
# 将时间元祖转成时间戳
time.mktime(local_time_tuple)复制代码
```


#### 将时间元祖转成格式化时间


```
# 将时间元祖格式化,
local_time_str = time.strftime("%Y-%m-%d %H:%M:%S", local_time_tuple)
# 可以将时间元祖转换为简单格式的字符串
time.asctime(local_time_tuple)复制代码
```


帮大家整理了比较常用的格式,当然,这个不需要记忆,用的时候可以查文档,但是常用的格式还是需要掌握的:


| 格式 | 含义
 | 注释 |
| %Y
 | 十进制数表示的带世纪的年份
 | 
 |
| %y
 | 十进制数 [00,99] 表示的没有世纪的年份
 | 
 |
| %m
 | 十进制数 [01,12] 表示的月
 | 
 |
| %d
 | 十进制数 [01,31] 表示的月中日
 | 
 |
| %H
 | 十进制数 [00,23] 表示的小时(24小时制)
 | 
 |
| %I
 | 十进制数 [01,12] 表示的小时(12小时制)
 | 
 |
| %M
 | 十进制数 [00,59] 表示的分钟
 | 
 |
| %S
 | 十进制数 [00,61] 表示的秒
 | 
 |
| %W
 | 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第0周。 | 
 |
| %U
 | 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)作为。在第一个星期日之前的新年中的所有日子都被认为是在第0周 | 
 |
| %w
 | 十进制数 [0(星期日),6] 表示的周中日
 | 
 |
| %p
 | 本地化的 AM 或 PM
 | 
 |
| %Z
 | 时区名称(如果不存在时区,则不包含字符)
 | 
 |


#### 将时间格式转成时间元祖


```
# 将时间格式转换为时间元祖
time.strptime(local_time_str, "%Y-%m-%d %H:%M:%S")复制代码
```


#### cpu时间


*   time.perf_counter() 高精度的时间计时器,可以用来测量短时间的值,比如:方法的执行时间。
*   time.process_time() 返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)
*   time.sleep() 暂停执行调用线程达到给定的秒数。需要注意的是:参数可以是浮点类型,也就是说,时间可以精确到毫秒级。


## datetime


相对于time模块,datetime模块更注重对时间和日期的运算,在其内部主要有六个class:


*   date:用于对日期进行处理,属性有:年、月、日。
*   time:用于对时间处理,属性是:时、分、秒、毫秒。
*   datetime:包含了date和time的信息,所以这里我们主要介绍datetime对应的方法和操作。
*   timedelta:主要用于对日期进行运算,可生成一个时间偏差。
*   tzinfo:用于对市区描述的抽象基类,一般我们用不到。
*   timezone:实现了tzinfo。


### 常用方法:


#### 获取今天的时间


```
test_dt = datetime.datetime.today()
print(test_dt)
print(test_dt.time())
print(test_dt.date())
print(test_dt.ctime())
print(test_dt.weekday())
print(test_dt.year)
# 从时间戳加载时间
test_dt_stamp = datetime.datetime.fromtimestamp(time.time())
print(test_dt_stamp)
# 从格列高利历序号加载时间,其中公元 1 年 1 月 1 日的序号为 1,
# 每增加一天,对应的值就增加1,比如公元1年1月2日的序号是2。
test_dt_dinal = datetime.datetime.fromordinal(1)
print(test_dt_dinal)复制代码
```


其中需要注意:


*   weekday()方法返回当前时间是一周中的第几天。默认的星期一是第0天,星期日是第6天。
*   fromordinal()方法是采用格列高利法,在计算时间时,不要忘记考虑闰年的情况。


### 时间的比较


这个比较好理解,datetime中的对象是可以直接被比较的,不过大多数情况下,比如:


```
 # 由两个时间戳获取datetime时间,从而比较他们的大小 
 test_stmap1 = datetime.datetime.fromtimestamp(time.time() - 4000000)
 test_stmap2 = datetime.datetime.fromtimestamp(time.time())
 if test_stmap2 > test_stmap1:
     print("test_stmap2 is bigger")复制代码
```


### 时间的计算


这主要是用到了我们前面提到了类:timedelta,它可以表示一个时间差值,比如:几天、几小时、甚至几周。然后我们可以找个时间基准来进行时间计算。比如,下面的例子,计算了昨天、今天、明天的时间:


```
# 计算昨天、今天、明天的时间
test_today = datetime.datetime.today()
print("today:", test_today)
one_day = datetime.timedelta(days=1)
yesterday = test_today - one_day
tomorrow = test_today + one_day
print("yesterday:", yesterday)
print("tomorrow:", tomorrow)复制代码
```


初次之外,timedelta还支持浮点型数字的运算:


```
# 浮点型运算
one_day = datetime.timedelta(days=1, hours=1)
one_point_five_day = one_day * 1.5
print(one_point_five_day)复制代码
```


这里需要注意的是:timedelta可以有多个参数,比如datetime.timedelta(days=1, hours=1, seconds=20)。那么和1.5相乘,每个参数都会和1.5相乘,比如上面例子的运行结果是:1 day, 13:30:00。


## Calendar


calendar类主要用于对日历的操作,我这里为大家整理了它比较常用的方法,掌握这些方法,够你在工作中使用了。


### 常用方法


#### 打印日历


```
 # 打印一年的日历
 calen = calendar.calendar(2020)
 print(calen)


 # 打印一个月的日历
 calen = calendar.month(2020,1)
 print(calen)


 # 打印的结果如下:
      January 2020
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31复制代码
```


看着是不是挺炫的,仅用一行代码就能打印日历。


#### 时间和月份


```
# 获取指定的年月日是星期几。
calendar.weekday(2020, 1, 7)
# 根据指定日期获取时间信息,返回两个值,第一个值表示1号是星期几,第二个值是这个月有多少天
calendar.monthrange(2019, 1)复制代码
```


#### 闰年计算


```
 # 检测某一年是否是闰年
 calendar.isleap(2019)


 # 检测指定年限内闰年的数量
 calendar.leapdays(2008, 2020)
复制代码
```


## 总结


python的时间处理模块,可以方便的帮你对时间进行处理,文中列出来比较高频使用的方法,当然大家如果感兴趣,完全可以去官方文档上翻看其他的方法(从前一段时间开始,python提供了中文的文档)。














阅读(1459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~