第一种用pytz

第二种手动加时区再转换格式

a= datetime.datetime.today()

o = datetime.timedelta(hours=8)

(a+o).strftime("%Y-%m-%d_%H:%M")

转化后效果test_admin_stable_2016-04-18_21:21.tar.gz

如果你的程序要考虑时区,可以使用pytz。datetime模块中有tzinfo相关的东西,但是它是一个抽象类,文档上说:

tzinfois an abstract base clase, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standardtzinfomethods needed by thedatetimemethods you use. Thedatetimemodule does not supply any concrete subclasses oftzinfo.上面是说tzinfo是一个抽象类,不应该被直接实例化。你需要派生子类,提供相应的标准方法。datetime模块并不提供tzinfo的任何子类。所以你可能会使用pytz这个模块。通过easy_install可以安装。目前它的最新文档在这里。关于时区使用的几点想法:1. 如果你的网站可能有来自其它时区的,可能你要考虑这个问题。都是一个地区的话,还要看服务器是否与用户在一个地区,如果不在,也要考虑。2. 因此,基本上要考虑服务器时区与用户时区。服务器时区可以配置在系统中,全局生效。而用户时区则与用户相关,可以由用户自已进行设置。3. 在生成相关时间对象时要加入时区的信息,并在输出时进行合适的转换。而pytz提供了创建某个时区对象的方法,如,中国时区:>>> import pytz>>> pytz.country_timezones('cn')['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']可以看到,中国的时区可能有:'Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing',最后两个不知道是什么。我们可能使用的'Asia/Shanghai'比较多。因此可以创建一个时区对象:>>> tz = pytz.timezone('Asia/Shanghai')然后在创建时间对象时进行指定:>>> import datetime>>> datetime.datetime.now(tz)datetime.datetime(2009, 2, 21, 15, 12, 33, 906000, tzinfo=)>>> datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz)datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=)>>> datetime.date(2009, 2, 21, tzinfo=tz)Traceback (most recent call last):File "", line 1, in TypeError: 'tzinfo' is an invalid keyword argument for this function>>> datetime.time(15, 12, 33, tzinfo=tz)datetime.time(15, 12, 33, tzinfo=)从上面可以看出now(), datetime(), time()都是可以指定tzinfo信息的,而date是不行的,不知道为什么。所以最好的方法是内部使用datetime对象,需要时进行时区转换,然后再输出。时区转换:>>> utc = pytz.utc>>> n = datetime.datetime.now(tz)>>> ndatetime.datetime(2009, 2, 21, 15, 16, 41, 843000, tzinfo=)>>> new = n.astimezone(utc)>>> newdatetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=)>>> utc.normalize(n.astimezone(utc))datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=)utc是世界标准时间。上面的代码通过astimezone(utc)将中国时间转为utc标准时间,可以看到不同的时区时间已经不一样了。不过在pytz的文档上说:Converting between timezones also needs special attention. This also needs to use the normalize method to ensure the conversion is correct.要注意什么呢?是 daylight savings time,中文叫日光节约时间或夏令时。对于有采用了夏时制的要使用normzlize来处理,不采用的,直接使用astimezone来处理。所以在通常情况下使用astimezone()就足够了。另外pytz还提供了全部的timezone信息,如:>>> from pytz import all_timezones>>> len(all_timezones)559>>> from pytz import common_timezones>>> len(common_timezones)393可以看到有很多。

在昨天与了关于pytz的东西后,还是发现一些问题。

>>> import pytz, datetime

>>> tz = pytz.timezone('Asia/Shanghai')

>>> tz

< DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

可以看到,它有一个LMT,这是Local Mean Time的缩写,网上查一查意思是本地平均时。而且时间是+8:06,说明与UTC的时差不是8个小时整。先不管它,让我们转换一下试试。

>>> d = datetime.datetime(2009,2,21,23,18,5,tzinfo=tz)

>>> d

datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=)

好,时区与tz是一样的,没什么。

>>> x = d.astimezone(pytz.utc)

>>> x

datetime.datetime(2009, 2, 21, 15, 12, 5, tzinfo=)

我们转为了UTC时区,时间上有差异,没问题。

让我们再转回来。

>>> x.astimezone(tz)

datetime.datetime(2009, 2, 21, 23, 12, 5, tzinfo=)

奇怪,看到了吧,变成了CST了。时差也成了+8:00了。CST就是Central Standard Time的意思。但这样就造成了转换的不一致。我们应该使用CST标准才对。

让我们再看一下:

>>> datetime.datetime.now(tz)

datetime.datetime(2009, 2, 22, 11, 11, 2, 125000, tzinfo=)

>>> datetime.time(23, 18, 5, tzinfo=tz)

datetime.time(23, 18, 5, tzinfo=)

可以看到now()函数得到的是CST的,而time传入tzinfo是LMT的。(date不支持tzinfo参数)所以我们要进行修订,怎么做,使用timezone对象的localize()方法,如:

>>> d = datetime.datetime(2009,2,21,23,18,5)

>>> tz.localize(d)

datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=)

所以我才明白pytz的文档上说的:

Creating localtimes is also tricky, and the reason why working with local times is not recommended. Unfortunately, you cannot just pass a ‘tzinfo’ argument when constructing a datetime.

所以我的建议是生成带时区的时间时,一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现,为些我封装了一些函数放在了uliweb/utils/date.py中。

另外关于北京时间。在pytz中,我无法找到Asia/Beijing和GMT+8这样的时区设置,但是有些时间转换的工具却有。按理说pytz使用的是标准的时区数据库,我特意下载了查看,的确是没有。时区处理的确是挺麻烦的事。象有些数据库也支持这样的功能,如postgres支持set timezone的命令,这是在django中看到的。

python 设置时区_python时区设置的两种方式相关推荐

  1. python扩展屏幕截图_Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  2. python动态捕捉屏幕_Python实现屏幕截图的两种方式

    使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 ...

  3. python截图拼接_Python实现屏幕截图有两种方式 - 小众知识

    使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处是灵活 速度快 缺点是:写法繁琐 不 ...

  4. python启动方法_python进程开启的两种方式

    一.进程 1.1.方式一 from multiprocessing import Process import time #方式一 def task(name): print(f"my na ...

  5. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  6. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  7. python怎么下载图片怎么保存到本地_详解Python下载图片并保存本地的两种方式

    一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码: import os,stat import urllib.request img_url ...

  8. 设置Word文档密码的两种方式

    重要的word文档,不想随便被别人打开来看怎么办?那就给它设置一个打开密码吧. Word的设置密码有两种方式: 第一种,打开Word文档后,依次点击上面工具栏的[文件]-[信息],再点击右侧[保护文档 ...

  9. python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  10. python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...

最新文章

  1. 一小时Docker教程
  2. java消息分发_Kafka教程设计思想之消息分发策略
  3. 提高效能 自我关怀的六个习惯
  4. hbase针对fullgc所做的优化(Memstore所作的优化 针对BlockCache所作优化)
  5. java转动的风扇课程设计,课程设计—智能风扇设计报告
  6. 数据结构-树的进化及与数据库的关系
  7. Facebook提出Pica模型,为Quest 2带来实时逼真虚拟化身渲染
  8. 在linux下运行锐捷客户端,锐捷Linux客户端使用方法(基于ubuntu16.04)
  9. QQ魔法卡片辅助工具外挂silverlight版
  10. 用两天整理出来的python英文单词大全,需要的赶快保存啦
  11. 清橙OJ 1082 查找第K小元素 -- 快速排序
  12. iOS 上传ipa包成功找不到ITMS-90338: Non-public API usage
  13. VR 中的常用指令设置及介绍
  14. 公司价值评估-自由现金流法
  15. httpclient Post请求 参数用des加密
  16. 解决:MAC 禁止 docker 开机自启
  17. 国密ESAM模块,7816接口、SPI接口、IIC接口可选
  18. 打开迷你云时显示apache2.2端口被占用
  19. 第六个实验 rs485实验
  20. 【Linux】循序渐进学运维-服务篇-FTP的原理及使用

热门文章

  1. 可视化图表之奥妙——百分比堆叠柱状图
  2. 在哪里能看到计算机缓存大小,win10系统查看电脑硬盘缓存大小的操作方法
  3. sklearn的决策树和随即森林的demo
  4. OpenCV 矩阵常用操作,比如 addWeighted, flip, hconcat, reduce, merge, norm, repeat, split, sort, mulSpectrum 等
  5. Spring事务和Aspects框架管理事务,看这篇就够了!(简单易懂!)
  6. 微信小程序开发工具安装流程
  7. Win10 电脑能连接手机热点上网,但是连接wifi时却只能登qq不能浏览网页的问题
  8. Python 编程 里面% 、 %s 和 % d 代表的意思
  9. 一组数中寻找加和最接近某个值的组合 JAVA实现
  10. 被面试官侮辱后,我决定通宵研究JVM!