热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python中时间处理_python中的时间处理模块

python中的时间处理python中处理时间的模块有三个,datetime,time,calendar,重点在于梳理出三个模块的设计脉络,

python中的时间处理

python中处理时间的模块有三个,datetime, time, calendar,重点在于梳理出三个模块的设计脉络,便于在需要的时候能够去查找相应的方法。由于calendar模块使用不多未做总结。以下demo均为python3。

1 . 概述

datetime模块主要是用来表示日期的,就是我们常说的年月日时分秒,calendar模块主要是用来表示年月日,是星期几之类的信息,time模块主要侧重点在时分秒,粗略从功能来看,我们可以认为三者是一个互补的关系,各自专注一块。此处还有一个小点需要注意dateutil,弥补了datetime不能处理月份的问题,用法同datetime共同总结。

理论储备

学习time模块前,我们需要先知道几个与时间相关的概

epoch

我们的时间基准点是什么时间?比如我说你身高1.8米,那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch,在Unix系统中,这个基准点就是1970年1月1日0点整那个时间点

GMT,UTC

上面我们说epoch表示1970年的起始点,那这个1970年又是相对于哪个基准时间呢?一般来说,就是相对于格林尼治时间,也叫做GMT(Greenwich Mean Time)时间,还叫做UTC(Coordinated Universal Time),为啥一个时间基准有两个名字?历史上,先有的GMT,后有的UTC.

UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间。所以,可以认为UTC是真正的基准时间,GMT相对UTC的偏差为0。

在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。

DST,tzone

我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区(tzone),此时,当我们说3点10分这个时间该打球了,还需加上是哪个时区的3点10分才能精确说明一个时间。另外一个对时间做出调整的就是DST.

DST 全称是Daylight Saving Time,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。

那么一定要问一问,python是如何知道tzone和DST这两个的值呢?答案是通过环境变量。

我们只以linux中TZ环境变量为例来说明一下。

CST+08EDT,M4.1.0,M10.5.0,这个字符串用空格分开他们,分成三部分

CST+08 EDT, M4.1.0, M10.5.0

第一部分中的CST表示时区的名字,即China Standard Time,也就是我们说的北京时间,+8表示北京时间减去8小时就是UTC时间

第二部分EDT表示DST的名字,我们说DST是因各个国家地区的政策法规不同而不同的,EDT后面也可以像CST后面一样加一个时间调整值,但由于我们国内只在86年到92年实行过一段时间DST,现在已经废止,所以后面不用加调整时间。

第三部分表示的是实行DST的开始和结束时间,没有在查询具体细节。

2. time模块

import time

t = time.time() # 从epoch到现在的秒数(用浮点数表示),用的是UTC时间

我们想把上面获取的秒数转换为年月日时分秒的形式,这种转换分为两种情况:一种是用UTC时间,一种用我们时区调整后的时间,二者都返回一个类struct_time的实例这两个函数如果调用时不传参数,它们内部会调用time.time(),并用返回的秒数做转换

time.gmtime(t) # 时间戳转换为UTC时区(0时区)的struct_time

time.localtime(t) # 所在时区调整后的时间

相反的,python同样提供了将这两种struct_time转为秒数的方法。

import calendar

calendar.timegm() # 把UTC的struct_time(gmtime的返回对象)转为从epoch开始的秒数

time.mktime() # 用来把用时区调整过的struct_time(即localtime的返回对象)对象转为从epoch开始的秒数

在时间和表示时间的字符串之间进行转换,time模块中的strftime和strptime就是做这个的。

strftime 即 string format time,用来将时间格式化成字符串

strptime 即string parse time,用来将字符串解析成时间

asctime 用来将一个struct_time对象转为标准24字符的字符串

ctime 方法与asctime作用相同,只不过它接收的是秒数,在内部,会先把秒数通过localtime转为struct_time,再往后就与asctime一样了

import time

time.localtime(time.time()) # 时间元组

fmt = '%Y-%m-%d %H:%M:%S'

time.strftime(fmt[,tupletime]) # 接收时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。

time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') # 根据fmt的格式把一个时间字符串解析为时间元组

ime.mktime(tupletime) # 接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)

time.sleep(secs) # 线程推迟指定的时间运行。单位为秒

time.clock() # 这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确)

time.asctime([t]) # 把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 2020'。如果没有参数,将会将time.localtime()作为参数传入

time.ctime([secs]) # 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()即当前时间戳为参数。它的作用相当time.asctime(time.localtime(secs))

小结:

time点time得秒数,结果传入gm, local time得struct_time。

要想变回原秒数你得传回calendar.timegm和time. mktime。

string f和string p格式化时间就靠他两个。

asctime ,ctime来助力,专门转字符串,前者接收struct_time,后者专门处理秒数

3. datetime模块



推荐阅读
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
author-avatar
许桂欢_173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有