datetime

  datetime是python处理日期和时间的标准库

  获取当前日期和时间

>>> from datetime import datetime
#获取当前的datetime
>>> now=datetime.now()
>>> now
datetime.datetime(2019, 7, 17, 9, 40, 18, 217033)
>>> print(now)
2019-07-17 09:40:18.217033
>>> print(type(now))
<class 'datetime.datetime'>

  注意导入的是datetime模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。

  获取指定的日期和时间

>>> from datetime import datetime
>>> dt=datetime(2019,7,17,9,46)
>>> print(dt)
2019-07-17 09:46: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(2019,7,17,9,46)
>>> dt.timestamp()
1563327960.0

  注意Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。

  某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。

  timestamp转换成datetime

  要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法

>>> t=1563327960.0
>>> print(datetime.fromtimestamp(t))
2019-07-17 09:46:00

  注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

  本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间

2019-07-17 09:46:00

  实际上就是UTC+8:00时区的时间

2019-07-17 09:46:00 UTC+8:00

  而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2019-07-17 09:46:00 UTC+0:00

  timestamp也可以直接被转换到UTC标准时区的时间

#本地时间
>>> print(datetime.fromtimestamp(t))
2019-07-17 09:46:00
#UTC时间
>>> print(datetime.utcfromtimestamp(t))
2019-07-17 01:46:00

  str转换为datetime

  很多时候,用户输入的日期和时间是字符串,要出来日期和时间,首先必须把str转换为datetime。转换的方法是通过datetime.strptime()实现,需要一根日期和时间的格式化字符串

>>> cday=datetime.strptime('2019-7-17 10:10:59','%Y-%m-%d %H:%M:%S')
>>> cday
datetime.datetime(2019, 7, 17, 10, 10, 59)
>>> print(cday)
2019-07-17 10:10:59

  字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。

  注意转换后的datetime是没有时区信息的

  datetime转换为str

  如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的,同样需要一个日期和时间的格式化字符串:

>>> now=datetime.now()
>>> now.strftime('%Y-%m-%d %H:%M:%S')
'2019-07-17 10:16:00'

  datetime的加减

  对日期和时间进行的加减实际上就是把datetime往后或往前计算,得到新的datetime.加减可以直接用+和-运算符,不过需要导入timedelta这个类

>>> from datetime import datetime,timedelta
>>> now=datetime.now()
>>> now
datetime.datetime(2019, 7, 17, 10, 18, 37, 967965)
>>> now+timedelta(hours=10)
datetime.datetime(2019, 7, 17, 20, 18, 37, 967965)
>>> now-timedelta(days=1)
datetime.datetime(2019, 7, 16, 10, 18, 37, 967965)
>>> now+timedelta(days=2,hours=12)
datetime.datetime(2019, 7, 19, 22, 18, 37, 967965)

  使用timedelta可以很容易地计算出前几天和后几天的时刻

  本地时间转换为UTC时间

  本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。

  一个datetime类似有一个时区属性tzinfo,但默认为Nonw,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区。

>>> from datetime import datetime,timedelta,timezone
>>> tz_utc_8=timezone(timedelta(hours=8))
>>> tz_utc_8
datetime.timezone(datetime.timedelta(seconds=28800))
>>> now=datetime.now()
>>> now
datetime.datetime(2019, 7, 17, 10, 44, 32, 7048)
>>> dt=now.replace(tzinfo=tz_utc_8)
>>> dt
datetime.datetime(2019, 7, 17, 10, 44, 32, 7048, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

  如果系统时区恰好是UTC+8:00,你们上述代码就是正确的,否则,不能强制设置为UTC+8:00时区

  打印dt会显示时区信息

>>> print(dt)
2019-07-17 10:44:32.007048+08:00

  如果没有转换,例如,则不包含时区信息

>>> dt=datetime(2019,7,17,10,48)
>>> print(dt)
2019-07-17 10:48:00

  时区转换

  我们可以先通过utcnow()拿到当前的UTC时间,再转换为任意时区的时间:

#那倒UTC时间,并强制设置时区为UTC+0:00
>>> utc_dt=datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2019-07-17 02:53:16.051837+00:00
#astimezone()将转换时区为北京时间
>>> bj_dt=utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2019-07-17 10:53:16.051837+08:00
#将转换为东京时间
>>> tokoy_dt=utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokoy_dt)
2019-07-17 11:53:16.051837+09:00
#将bj_dt转换为东京时间
>>> tokoy_dt2=bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokoy_dt2)
2019-07-17 11:53:16.051837+09:00

  时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。

  利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

  注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime都可以正确转换,例如上述bj_dttokyo_dt的转换。

  小结

  datetime表示时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。

  如果要存储datetime,最近方法是将其转换为timestamp再存储,因为timestamp的值与时区无关

  

  练习

  假如你获取了用户输入日期和时间如2019-7-17 11:01:30,以及一个时区信息例如UTC+5:00,均是str,请编写一个函数将其转换为timestamp

  to_timestamp.py

import re
from datetime import datetime,timezone,timedelta
def to_timestamp(dt_str,tz_str):
#把用户输入的字符串转换成时间,格式为类似2015-06-01 08:10:30但是不包含时区信息
cday=datetime.strptime(dt_str,'%Y-%m-%d %H:%M:%S')
#通过tz_str格式为UTC+7:00获取时区信息
#例如tz_str='UTC+7:00'正则匹配offset为7
offset=int(re.match(r'^UTC([+|-]\d+):\d{2}$',tz_str).group(1))
#设置时区信息
tz_utc=timezone(timedelta(hours=offset))
#把cday加上时区信息
dt=cday.replace(tzinfo=tz_utc)
#加上时区信息的时间可以通过timestamp()方法生成时间戳作为函数返回值
return dt.timestamp() print(to_timestamp('2015-6-1 08:10:30','UTC+7:00'))
print(to_timestamp('2015-5-31 16:10:30','UTC-09:00'))

  输出

1433121030.0
1433121030.0

  

Python3之内建模块datetime的更多相关文章

  1. Python3之内建模块itertools

    python的内建模块itertools提供了非常有用的用于操作迭代对象的函数 首先,我们看看itertools提供的几个无限迭代器 >>> import itertools > ...

  2. Python3 内建模块 datetime/collections/base64/struct

    datetime 我们先看如何获取当前日期和时间: >>> from datetime import datetime >>> now = datetime.now ...

  3. Python3之内建模块collections

    collections是python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不可变集合,例如,一个点的二维坐标可以表示成 >>> ...

  4. Python3之内建模块hashlib

    摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串( ...

  5. Python3之内建模块base64

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  6. Python3 内建模块 hashlib、itertools、HTMLParser、urllib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...

  7. python常用内建模块——datetime

    datetime是python处理日期和时间的标准库. 获取当前日期和时间 >>>from datetime import datetime >>>now = da ...

  8. python常用内建模块--datetime

    datetime模块中的datetime类: 获取当前时间:datetime.now() 当前操作系统时区时间,date.utctime(UTC时间) 转换成时间戳:timestamp() 和具体时区 ...

  9. 四十一 常用内建模块 datetime

    datetime是Python处理日期和时间的标准库. 获取当前日期和时间 我们先看如何获取当前日期和时间: >>> from datetime import datetime &g ...

随机推荐

  1. 【angularJS】学习笔记

    一.一个html中多个ng-app //对于ng-app初始化一个AngularJS程序属性的使用需要注意,在一个页面中AngularJS自动加载第一个ng-app,其他ng-app会忽略 //如果需 ...

  2. web场景的监控

    在一台可以连外网的主机上创建web场景, 添加步骤,zabbix可以步骤化web页面,例如,登陆操作,正常操作是要先验证用户获取token,step1就可以是先访问token页面,获取到返回的toke ...

  3. 洛谷 P2010 回文日期 题解

    P2010 回文日期 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日 ...

  4. 微信小程序微信登录

    开发接口 登录 wx.login wx.checkSession 签名加密 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 登录流程时序 ...

  5. android studio 使用第三方模拟器连接方法

    安装完模拟器后,要使用adb命令Android studio才能识别出来: 打开cmd,输入:adb connect 127.0.0.1:26944.如下: 海马玩模拟器的端口号是26944. 逍遥安 ...

  6. 【洛谷】P2568 GCD

    前言 耻辱,我这个OI界的耻辱! 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.输入格式  一个整数N输出格式答案输入输出样例  输入  4  ...

  7. spaceclaim脚本(内摆线)

    import math #导入数学模块,因为会使用π def x_comp(k,r,t): #定义x坐标的计算函数 return r * (k -1) * math.cos(t) + r * math ...

  8. cat命令的简单实现

    cat命令的简单实现 目标:简单的实现cat命令 实现的mic_cat命令主要有三大功能 1.mic_cat命令一次显示整个文件 $ mic_cat filename 2.mic_cat命令从键盘创建 ...

  9. 浅谈Linux环境下Socket选项的设置

    0.前言 TCP/IP协议栈是Linux内核的重要组成部分和网络编程的基石,虽然Linux和BSD有很大的联系,但是对于某些Socket选项和内核操作仍然存在差异,因此文中适用场景均为CentOS环境 ...

  10. qt 应用程序版本设置方法

    pro 增加 VERSION = 1.2.3.4 DEFINES += APP_VERSION=\\\"$$VERSION\\\" 应用程序中用 APP_VERSION 宏就可以获 ...