python日期和时间相加_Python中的时间与日期

作者: dameng

本篇介绍python自带的时间与日期包的使用,不涉及任何需要额外安装的包。

python中的时间日期等对象datetime

date

time X2

timestamp

timezone

timedelta

这里面我们主要使用的是datetime,而timestamp则是另一种展现形式,也就是一个数字

datetime 的基本表达

如果我们有这么一个时间戳 2019-01-01 00:00:00,有日期,有时间,所以可以直接对应的就是日期时间对象datetime了,在python中可以这样声明datetime(2019,1,1, 0,0,0),如果直接将这个对象用print输出,其会输出2019-01-01 00:00:00。

从字面意义理解datetime对象是由date和time两个部分组成的,如果设计的足够直观,够按照这个推理,一个date对象和一个time对象应该是可以构造一个datetime, 只是稍微有些不够直观的是,你需要使用combine方法来构造新的datetime,而不是以构造参数的方式传入date和time

d = date(2019,1,1)

print(d)

t = time(0,0,0)

print(t)

# dt = datetime.datetime(date=d, time=t)

dt = datetime.datetime.combine(d, t)

print(dt)

上面的输出如下,

2019-01-01

00:00:00

2019-01-01 00:00:00

另外,很直观的,你可以使用datetime获取相关的一些参数,比如年月日,时分秒

print("{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second))

print(dt.weekday())

print(dt.isoweekday())

print(dt.isocalendar())

print(dt.date())

print(dt.time())

其会输出, 要注意的是,比如今天是星期四,isoweekday输出的是4,weekday输出的是3

2019-04-04 17:19:05

3

4

(2019, 14, 4)

2019-04-04

17:19:05.766999

时间与数字

如果你使用dir来查看datetime的方法,应该能观察到其包含有一个timestamp, timestamp是一个浮点型的小数,表示当前时间到utc时间1970.01.01凌晨相距的秒数。

和timestamp不同,python的time包中还有一个time对象,当我们调用time.time()会返回一个float形态的数值,其精度比timestamp更高(多一位)。如果是需要更高的精度,可以使用time.time_ns()获取纳秒级别的数值, 不过此时返回的是整数形态,精度比timestamp高三位!

# timestamp的底层实现

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

将时间转换成数字有几个优势,但是具体还要按需求来定,更小的存储

方便的比较与计算(当然本身datetime对象也是支持的,但是某些需要引入timedelta对象)

格式相对统一(因为简单)

如果要使用timestamp完成时间的比较与加减,直接计算就好了。但是如果要使用timestamp就会稍微麻烦一些,datetime目前支持如下几种

datetime2 = datetime1 + timedelta

datetime2 = datetime1 - timedelta

timedelta = datetime1 - datetime2

datetime1 < datetime2Compares datetime to datetime.

要注意的是datetime和timedelta做加减后的对象依旧是datetime

datetime对象之间可以直接比较

datetime和datetime相减,得到一个timedelta对象,同时小减大,将得到负数

datetime不可以和datetime相加

比如要计算当前时间的8小时后,就是

n = datetime.datetime.now()

m = n + datetime.timedelta(hours=8)

print(m, type(m))

print(m

其会输出

2019-04-09 02:36:37.956798

False True

万恶之源

要注意的是,像这样datetime(2019,1,1, 0,0,0)声明的一个对象是没有时区信息的,每一个datetime对象都有一个tzinfo的属性,而刚刚生成的这个对象的tzinfo是None。如果要声明一个带有时区信息的datetime对象需要先声明一个时区, 而这个时区就是一个timezone对象,可以通过timedelta来完成构造

e8zone = timezone(timedelta(hours=8), 'Asia/Shanghai')

d = datetime(2019,1,1, 0,0,0, tzinfo=e8zone)

print(d)

而此时的输出是

2019-01-01 00:00:00+08:00

可以看到和前面相比多出来了+08:00的信息表示东八区, 如果是一个没有timezone的datetime对象,时区部分则不会输出。

另外,你还可以定制化datetime对象的输出

f = d.strftime("%Y-%m-%d%H:%M:%S.%f%Z")

print(f)

此时,会输出

2019-01-01 00:00:00.000000 Asia/Shanghai

此时,%Z输出了文字形式的时区,如果想要类似+0800形式的时区格式,可以换成%z时区不只是+8,-8这样的,还有不规则的时区比如加拿大纽芬兰的时区

e3mzone = timezone(timedelta(hours=-3, minutes=-30), 'Canada/Newfoundland')

d = datetime.datetime(2019,1,1, 0,0,0, tzinfo=e3mzone)

print(d)

会输出

2019-01-01 00:00:00+08:00

而当我们替换时区时,默认的python包并不会自动转换

e3mzone = timezone(timedelta(hours=-3, minutes=-30), 'Canada/Newfoundland')

d = datetime.datetime(2019,1,1, 0,0,0, tzinfo=e3mzone)

print(d)

e8zone = timezone(timedelta(hours=8), 'Asia/Shanghai')

d = d.replace(tzinfo=e8zone)

print(d)

会输出

2019-01-01 00:00:00-03:30

2019-01-01 00:00:00+08:00比时区更加复杂的是夏时制(夏令时)

夏时制(夏令时),又称日光节约时间,是一种在夏季月份牺牲正常的日出时间,而将时间调快的做法。通常使用夏时制的地区,会在接近春季开始的时候,将时间调快一小时,并在秋季调回正常时间。实际上,夏时制会造成在春季转换当日的睡眠时间减少一小时,而在秋季转换当日则会多出一小时的睡眠时间。 1895年,乔治·哈德逊提出了夏时制的概念。

在python3.6之后,python的datetime引入了一个新的参数fold,用来折叠这个时间.

举例来说,比如德国时间会在29th of October 2017 at 3 AM回调到 2 AM, 那么同样是 2:30 AM, 就会有两个了,一个是会调前的,一个是回调后的。fold=0 和 1 则分别对应了这两种时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值