utc时间、本地时间及时间戳转化
1、时间戳的概念
时间戳的定义请看百科unix时间戳,需要注意的时间戳为当前时刻减去UTC时间(1970.1.1)零点时刻的秒数差,与当前系统所处的时区无关,同一时刻不管在任何时区下得到的时间戳都是一样的。
最近因为存储数据库需要将时间转为时间戳的字节型来存储,用了python datetime模块,期间遇到一些问题,现在终于弄懂了时间戳、时间和UTC时间的正确转换关系,总结以下供大家参考。
2、python datatime模块实现时间戳和本地时间、UTC时间之间的互相转化
1) 获得unix timestamp
dt=datetime.datetime.now() #获取本地当前时间
dt.timestamp() #获取时间戳
注:
- 此方式下now()函数中有个参数为tz,参数意思为时区信息,不设时为本地时间,当设置时,如tz=timezone.utc,则表示为当前的utc时间,无论是utc时间还是本地时间,获得的时间戳都是同一个值.
- timestamp()内部会根据时区设置得到时间戳,当时区为utc时间时timestamp()函数直接减去EPOCH得到的秒数,当为其他时区的时间时通过标准C库函数mktime得到相差秒数,不管哪种方式,相差的秒数差是一样的,所以不同时区下的时间戳必定为同一个值。
2) python datetime模块的小坑
由1)的阐述得到python在不同时区下都能获得时间戳,我就采用了utc时间获得时间戳,datetime有两种方式获得utc时间:
方式一:
dt=datetime.datetime.now(timezone.utc) #类型为aware datetime object,时区为utc
dt.timestamp() #通过减去EPOCH得到时间戳
方式二:
dt=datetime.datetime.utcnow() #类型为naive datetime object,不包含时区信息
dt.timestamp() #通过mktime得到时间戳(得到的时间戳是错误的
- 在未理解naive和aware之前,以为两种方式获得时间戳都是一样的,未曾想第二种方式下再通过timestamp()获得的时间戳是错误的,为什么会发生这种情况,是因为naive是不含时区的类型,而aware是有时区类型。
- 第二种虽然和方式一获得的值是相同的,但是第二种方式不包含时区信息,在方式二下执行dt.timestamp(),timestamp()默认tz=None,即为本地时区,这样就会按照mktime得到秒数差,但其实此时dt却是utc时间。而方式一有时区信息,执行dt.timestamp()是直接减去EPOCH时间。
- 当时间值相同时,naive类型和aware类型时间下执行timestamp()结果是不一样的,一定要注意,不能踩了这个坑,除非是本地时间,如果想通过其他时区的时间通过timestamp()得到时间戳,一定要带有时区信息。
3) 通过timestamp得出datetime和utc datetime
timestamp转datetime
datetime.datetime.fromtimestamp(timestamp) #获得本地时间,类型naive datetime obiect
timestamp转utc datetime
两种方式获得utc时间,但datetime object类型不一样。
方式一:
datetime.datetime.utcfromtimestamp(timestamp) #类型naive datetime object
方式二:
datetime.datetime.fromtimestamp(timestamp,timezone.utc) #类型aware datetime object。
3、总结:
- timestamp没有时区之分,不要认为不同时区有不同的时间戳。
- datetime object有两种类型,naive是不含时区的类型,而aware是有时区类型,就算显示的值一样,不同类型的object也不能直接进行数学运算。
utc时间、本地时间及时间戳转化的更多相关文章
- UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明
1.UTC时间 与 GMT时间 整个地球分为二十四时区,每个时区都有自己的本地时间.为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated). ...
- UTC 转本地时间
String dateStr = "Wed Dec 10 00:00:00 UTC 0800 2014"; //Wed Dec 10 00:00:00 UTC 0800 2014 ...
- UTC与本地时间字符串互相转换
#!/usr/bin/env python import time import datetime # 格式自改 UTC_FORMAT = '%Y-%m-%dT%H:%M:%SZ' LOCAL_FOR ...
- Sql Server 的本地时间和UTC时间
一,本地时间和UTC时间 本地时间 世界的每个地区都有自己的本地时间,整个地球分为二十四时区,每个时区都有自己的本地时间. UTC时间 在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时 ...
- UTC、GTC时间和本地时间
1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...
- 关于UTC时间和本地时间
收藏了个类Publics 可以实现本地时间和UTC时间的转换 UCT时间=本地时间-8 本地时间比UTC时间快8小时 element-ui的日期选择器上 选择的时间显示的是本地时间 但实 ...
- QDateTime 本地时间和UTC时间转换问题
先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...
- UTC、GTC时间和本地时间(Linux默认使用UTC时间,要修改一下)
1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...
- scala 时间,时间格式转换
scala 时间,时间格式转换 1.scala 时间格式转换(String.Long.Date) 1.1时间字符类型转Date类型 1.2Long类型转字符类型 1.3时间字符类型转Long类型 2. ...
随机推荐
- java学习笔记之String.Split方法
hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗? 我们来看看吧. 首先我们来看看我们最常用的split()方法也就是单个参数的方法 pu ...
- 可执行jar包
我已经解决了这个问题,在eclipse中有一个打包工具,可以将程序打包成.jar文件: 右键要打包的 project--->Export--->Java--->JAR file--- ...
- Linux mail发送邮件
发送前一天的监控日志#!/bin/bash source /etc/profile time=`date -d '-1 day' "+%Y%m%d"` #判断服务是否已经启动 se ...
- spring BeanFactory加载xml配置文件示例
项目目录结构如下: HelloWorld.java package com.thief.demo; public class HelloWorld { public void sayHello() { ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- Residual (numerical analysis)
In many cases, the smallness of the residual means that the approximation is close to the solution, ...
- git本地仓库管理远程仓库
git remote add origin https://xxxxxgit push -u origin master
- js:深入函数的定义
函数定义方式: 1.function fun1(){alert("fun1");} //函数就是一个很特殊的对象.是一个Function的实例.事实上在内存中存储的操作是通过一个 ...
- wecenter 问答社区 dockerfile,不用纠结于物理机的运行环境
FROM webdevops/php-nginx:centos-7-php56 ADD . /app RUN ["chmod", "777", "/a ...
- mongodb 的注意点
昨天同事安装mongodb遇到了些问题,问了下我,后拉发现都是些细节没注意(讲道理这应该是很简单,一顿操作就ok的事情) 首先,下载 mongo包, 然后 ,解压安装, 启动之. 问题就出现在他后台启 ...