Python2中生成时间戳(Epoch,或Timestamp)的常见误区
在Python2中
datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误。关于Epoch可以参见时区与Epoch
0 Python中生成Epoch
from datetime import datetime
# python3
datetime.now().timestamp()
# python2
import time
time.mktime(datetime.now().timetuple()) # 为了兼容python2和3,该用法使用更广泛
1 错误代码
from datetime import datetime
import pytz
aware_date = datetime.utcnow().replace(tzinfo=pytz.utc)
time.mktime(aware_date.timetuple()) # bug here
2 原因
Python中的datetime对象分为带时区信息和不带时区信息的两种对象即naive和aware对象。在处理naive时,一切皆默认为系统时区,没有任何问题。
在Python3中执行timestamp时对于naive对象,按照默认时区处理(调用time.mktime),而aware对象,则带上时区计算与UTC基准时间的间隔秒数得到,也就是将时区信息考虑在内。
而Python2和3中的timetuple方法,返回的结果没有包含时区信息,也没有进行时区转换。即调用timetuple对于aware日期对象而言,时区信息被丢弃,因此再调用time.mktime将得到一个错误的结果
3 解决办法
方法一:将其他时区的aware日期,转换为当前系统默认的时区的aware对象, 由于与系统时区一致,因此该aware对象与无时区的naive对象执行
timetuple的效果一样。
转换时区参见timezone,即调用astimezone方法,参数为转换后的时区(tzinfo实例)
由于Python2中缺失tzinfo(抽象基类)的各个时区实例,需要自己构造时区对象。
时区实例可以参考官方文档的实现datetime或使用推荐的第三方库pytz方法二:计算时间差
_EPOCH = datetime(1970, 1, 1, tzinfo=pytz.utc) # 第三方库 pytz
(aware_date - _EPOCH).total_seconds()
Python2中生成时间戳(Epoch,或Timestamp)的常见误区的更多相关文章
- kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)
这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...
- LR中的时间戳函数web_save_timestamp_param
以前真没注意过后面看某个群有人说到这个函数一查,还真有,那么处理时间戳就简单很多了,我们经常在各种网站上看到类似于这样的时间戳 51Testing软件测试网"d bLq!uR&am ...
- 如何在高并发分布式系统中生成全局唯一Id
月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1. ...
- java 如何在pdf中生成表格
1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...
- 如何在高并发分布式系统中生成全局唯一Id(转)
http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...
- (转)如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...
- .NET、PHP、MySql、JS中的时间戳你每次是手写还是复制?这篇文章让你一次性搞懂
什么是时间戳(chuō)? 答:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 为什么时间戳要从1970年01月0 ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- 170120、java 如何在pdf中生成表格
1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...
随机推荐
- android获取Context
如果在Activity方法中,直接使用this. 如果在Activity内部类中,使用Activity.this
- 常见Soc平台图形内存管理学习笔记
硬件编解码.硬件图像scale等过程,是在专有的硬件单元里进行,其使用的内存也是专有的内存,这种内存多是SoC中图形内存.如此方便与硬件加速图形渲染.图像显示.硬件图像加速处理等功能相交互. 上述过程 ...
- 转:Eclipse Memory Analyzer入门学习笔记
原文地址:https://blog.csdn.net/cc907566076/article/details/79108782 Eclipse Memory Analyzer是一个快速而功能丰富的Ja ...
- git 恢复本地误删文件
git status git reset HEAD 路径(git status 会显示的路径) git checkout 路径
- js 数字随机滚动(数字递增) 每日凌晨回到原点,重新计算
html: <div class="textMon"> <!--<img src="./img/20180830160315.png" ...
- for循环、while循环、break、continue、exit
1. for循环 语法:for 变量名 in 条件; do …; done案例1 #!/bin/bashsum=0for i in `seq 1 100`do# echo "$sum + $ ...
- 不同系统、不同存储格式(textfile, parquet)数据的传递
描述: 本地测试环境hive中有数据,存储格式为textfile,现在要上传到公司开发环境,存储格式为parquet, 如何实现??? tb_textfile表---> local file - ...
- java-IO流-其他流
###22.01_IO流(序列流)(了解) * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, ...
- 我在web前端路上的第一个脚印
这是我的第一篇博客,希望记录下我在路上见到的风景,也和大家一起分享.
- transmission跳过文件校验功能实现
贴吧链接:https://tieba.baidu.com/p/4839039900 GitHub:https://github.com/superlukia/transmission-2.92_ski ...