Python学习笔记(三十二)常用内建模块(1)— datetime
- >>> from datetime import datetime
- >>> now = datetime.now() # 获取当前datetime
- >>> print(now)
- 2015-05-18 16:28:07.198690
- >>> print(type(now))
- <class 'datetime.datetime'>
获取指定日期和时间
要指定某个日期和时间,我们直接用参数构造一个datetime
:
- >>> from datetime import datetime
- >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
- >>> print(dt)
- 2015-04-19 12:20:00
datetime转换为timestamp
在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0
(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp。
你可以认为:
- timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
对应的北京时间是:
- timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
可见timestamp的值与时区毫无关系,因为timestamp一旦确定,其UTC时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以timestamp表示的,因为全球各地的计算机在任意时刻的timestamp都是完全相同的(假定时间已校准)。
把一个datetime
类型转换为timestamp只需要简单调用timestamp()
方法:
- >>> from datetime import datetime
- >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
- >>> dt.timestamp() # 把datetime转换为timestamp
- 1429417200.0
注意Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。
某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
- >>> from datetime import datetime
- >>> t = 1429417200.0
- >>> print(datetime.fromtimestamp(t))
- 2015-04-19 12:20:00
本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:
- 2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:
- 2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:
- 2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被转换到UTC标准时区的时间:
- >>> from datetime import datetime
- >>> t = 1429417200.0
- >>> print(datetime.fromtimestamp(t)) # 本地时间
- 2015-04-19 12:20:00
- >>> print(datetime.utcfromtimestamp(t)) # UTC时间
- 2015-04-19 04:20:00
str转换为datetime
很多时候,用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()
实现,需要一个日期和时间的格式化字符串:
- >>> from datetime import datetime
- >>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
- >>> print(cday)
- 2015-06-01 18:19:59
字符串'%Y-%m-%d %H:%M:%S'
规定了日期和时间部分的格式。详细的说明请参考Python文档。
注意转换后的datetime是没有时区信息的。
datetime转换为str
如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()
实现的,同样需要一个日期和时间的格式化字符串:
- >>> from datetime import datetime
- >>> now = datetime.now()
- >>> print(now.strftime('%a, %b %d %H:%M'))
- Mon, May 05 16:28
datetime加减
对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+
和-
运算符,不过需要导入timedelta
这个类:
- >>> from datetime import datetime, timedelta
- >>> now = datetime.now()
- >>> now
- datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
- >>> now + timedelta(hours=10)
- datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
- >>> now - timedelta(days=1)
- datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
- >>> now + timedelta(days=2, hours=12)
- datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
本地时间转换为UTC时间
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。
一个datetime
类型有一个时区属性tzinfo
,但是默认为None
,所以无法区分这个datetime
到底是哪个时区,除非强行给datetime
设置一个时区:
- >>> from datetime import datetime, timedelta, timezone
- >>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
- >>> now = datetime.now()
- >>> now
- datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
- >>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
- >>> dt
- datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
如果系统时区恰好是UTC+8:00,那么上述代码就是正确的,否则,不能强制设置为UTC+8:00时区。
时区转换
我们可以先通过utcnow()
拿到当前的UTC时间,再转换为任意时区的时间:
- # 拿到UTC时间,并强制设置时区为UTC+0:00:
- >>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
- >>> print(utc_dt)
- 2015-05-18 09:05:12.377316+00:00
- # astimezone()将转换时区为北京时间:
- >>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
- >>> print(bj_dt)
- 2015-05-18 17:05:12.377316+08:00
- # astimezone()将转换时区为东京时间:
- >>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
- >>> print(tokyo_dt)
- 2015-05-18 18:05:12.377316+09:00
- # astimezone()将bj_dt转换时区为东京时间:
- >>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
- >>> print(tokyo_dt2)
- 2015-05-18 18:05:12.377316+09:00
时区转换的关键在于,拿到一个datetime
时,要获知其正确的时区,然后强制设置时区,作为基准时间。
利用带时区的datetime
,通过astimezone()
方法,可以转换到任意时区。
注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime
都可以正确转换,例如上述bj_dt
到tokyo_dt
的转换。
小结
datetime
表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。
如果要存储datetime
,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
练习
假设你获取了用户输入的日期和时间如2015-1-21 9:01:30
,以及一个时区信息如UTC+5:00
,均是str
,请编写一个函数将其转换为timestamp:
- import re
- from datetime import datetime, timezone, timedelta
- def to_timestamp(dt_str, tz_str):
- time_zone = re.match(r'UTC([+|-]\d{1,2}):00$', tz_str).group(1)
- time = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')\
- .replace(tzinfo=timezone(timedelta(hours=int(time_zone))))\
- .timestamp()
- return time
- t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
- assert t1 == 1433121030.0, t1
- t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
- assert t2 == 1433121030.0, t2
- print('Pass')
Python学习笔记(三十二)常用内建模块(1)— datetime的更多相关文章
- 四十二 常用内建模块 collections
collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> ...
- 四十六 常用内建模块 itertools
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个“无限”迭代器: >>> import itertools ...
- Python学习笔记第十二周
目录: 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务 索引 创建数据库 外键 增删改查表 权限 python 操作mysql ORM sqla ...
- Python学习(三十二)—— Django之视图系统
转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...
- python学习笔记(十二)之函数
牛刀小试: 定义一个无参函数 >>> def myFirstFunc(): ... print("Hello python") ... print("h ...
- Python学习笔记第二十二周(前端知识点补充)
目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 4.列表属性 5.float 6.clear 7.position 8.text-decoration(a标签下划 ...
- python学习笔记(十二):发送邮件
我们在开发程序的时候,有时候需要开发一些自动化的任务,执行完之后,将结果自动的发送一份邮件,python发送邮件使用smtplib模块,是一个标准包,直接import导入使用即可,代码如下: impo ...
- Python 学习笔记(十二)Python文件和迭代(一)
文件 文件和文件夹 文件:文本文件.二进制文件 文件夹:(windows) G:\pythonWorkspace\python\study (linux/mac) /home/workspace/py ...
- python学习笔记(十)常用模块
import os print(os.getcwd())#取当前工作目录,绝对路径 print(os.chdir("../"))#更改当前目录,.代表当前目录,..代表上一级目录 ...
- python学习笔记-(十二)scoket编程基础
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...
随机推荐
- 01慕课网《vue.js2.5入门》——基础知识
前端框架 Vue.js2.5 2018-05-12 Vue官网:https://cn.vuejs.org/ 基础语法+案例实践+TodoList+Vue-cli构建工具+TodoList Vue基础语 ...
- Alpha事后诸葛(团队)
[设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...
- IOC 依赖注入 Unity
http://kb.cnblogs.com/page/115333/ http://www.bianceng.cn/Programming/net/201007/18255.htm http://bl ...
- Dsyy的第一篇博文~
2017-08-07 周一 晴热热热热热 咳咳,很多人看到dsyy第一反应是什么意思?当然是大神媛媛!显然不是些(diao)(si)yy.(da)(si)yy...的别义,咋有点此地无银三百两的感 ...
- web.py 笔记
1.涉及到id=‘id’的情况,需要加入 vars=locals() ,因为id在python里有id() 函数 db.delete('entries', where = 'id = $id', ...
- PHP《将画布(canvas)图像保存成本地图片的方法》
用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...
- Java 中 Vector、ArrayList、List 使用深入剖析
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...
- list+map
通常读取数据库表中的一条记录后,可以存储于Hashmap变量中:若要读取多条记录,则依次读取每个记录时,先用Hashmap变量存取,然后将Hashmap加到ArrayList变量中. 注意: 每次读取 ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
- Interviewe HDU - 3486( 暴力rmq)
面试n个人,可以分任意组数,每组选一个,得分总和严格大于k,问最少分几组 就是暴力嘛...想到就去写吧.. #include <iostream> #include <cstdio& ...