思路

  • Linux 打印当前的 timestamp

  • Linux 如何查看当前机器的时区

  • Python 中访问时区、当地时间、UTC 时间

  • 平时编程中对时间的处理

  • 整理和时区相关的信息

打印 timestamp

$ date +%s

Unix时间戳(Unix timestamp)转换工具 - 站长工具

Linux 查看和设置当前时区

date 的时候可以知道现在是什么时区。

$ date +%Z
CST
$ date +%z
+0800

Ubuntu 中如下设置:

$ sudo dpkg-reconfigure tzdata

date - Timezone setting in Linux - Unix & Linux Stack Exchange

Python 与时区

Python 打印当前的时区

>>> import time
>>> time.strftime("%z")
'+0800'
>>> time.strftime("%Z")
'CST'
>>> time.tzname
('CST', 'CST')

datetime 和 timestamp 转换实验

timestamp 都是和 utc 时间做比较的。从 timestamp 到 datetime 比较容易。但需要注意默认转换出来的 datetime 是本地的(但是对象里面不携带这个时区信息,所以有时候得注意)。

在 CST+0800 时区的机器执行的结果如下:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1464771600)
datetime.datetime(2016, 6, 1, 17, 0)
>>> datetime.datetime.utcfromtimestamp(1464771600)
datetime.datetime(2016, 6, 1, 9, 0)

在 MSK+0300 时区的机器执行的结果如下:

>>> datetime.datetime.fromtimestamp(1464771600)
datetime.datetime(2016, 6, 1, 12, 0)
>>> datetime.datetime.utcfromtimestamp(1464771600)
datetime.datetime(2016, 6, 1, 9, 0)

这个虽然是转换,但是其实会和机器 timezone 相关。

而 datetime 转 timestamp Python 3.3 以下没有提供直接的函数,其实道理不复杂,就是先转换成 UTC 环境下的时间,然后再去计算和 1970 的时间差就好了。

local datetime to utc datetime

这个转换也是很不方便,虽然说起来道理是很简单的,所以先不深究了,这次只要先了解个大概。

平时编程中对时间的处理

储存时间的时候应该储存 timestamp 会比较好,其他的再用 timestamp 转换格式都比较方便。

像现在代码中直接存储 datetime.datetime.now(),存在数据库中的时候是类似这个 2016-06-01 12:43:52.625111 的字符串,但是如果读取的机器的时区和填写数据的机器的时区不一样的话就有问题了。好在主要是给国内的单个时区的用户使用,所以还可以接受。

反过来这样的时间当做字符串传给客户端的时候客户端就需要把它当做 +8 的时间转换成 UTC 然后再转换成设备当地的时间才行,否则就很奇怪了。

有关时间的其他

中国的统一时区还是蛮方便的。但是毕竟有时差,有的事情和统一时区就没太大关系了,比如会存在篮球比赛啊、世界杯啊、发布会直播的时候我们这里是晚上,还有我们这里下班了看新闻联播直播的时候新疆那里还没有下班。

有用信息收集

其他参考


常伟佳
310 声望16 粉丝

引用和评论

0 条评论