`

python时区设置的两种方式

阅读更多

        第一种用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相关的东西,个抽象类,文档上说:


tzinfo is 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 standard tzinfo methods needed by thedatetime methods you use. The datetime module does not supply any concrete subclasses of tzinfo

上面是说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=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz)
datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
>>> datetime.date(2009, 2, 21, tzinfo=tz)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tzinfo' is an invalid keyword argument for this function
>>> datetime.time(15, 12, 33, tzinfo=tz)
datetime.time(15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

从上面可以看出now(), datetime(), time()都是可以指定tzinfo信息的,而date是不行的,不知道为什么。所以最好的方法是内部使用datetime对象,需要时进行时区转换,然后再输出。

时区转换:

>>> utc = pytz.utc
>>> n = datetime.datetime.now(tz)
>>> n
datetime.datetime(2009, 2, 21, 15, 16, 41, 843000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> new = n.astimezone(utc)
>>> new
datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>)
>>> utc.normalize(n.astimezone(utc))
datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>)

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=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

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

>>> x = d.astimezone(pytz.utc)
>>> x
datetime.datetime(2009, 2, 21, 15, 12, 5, tzinfo=<UTC>)

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

让我们再转回来。

>>> x.astimezone(tz)
datetime.datetime(2009, 2, 21, 23, 12, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

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

让我们再看一下:

>>> datetime.datetime.now(tz)
datetime.datetime(2009, 2, 22, 11, 11, 2, 125000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> datetime.time(23, 18, 5, tzinfo=tz)
datetime.time(23, 18, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

可以看到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=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

所以我才明白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 不同时区之间的差值与转换方法

    时区是一种按照地理位置划分的全球时间标准,通常以UTC(协调世界时)作为基准。在Python中,我们可以使用内置的`datetime`、`time`模块,以及第三方库如`pytz`来处理这些任务。 在给定的代码片段中,主要展示了...

    python3.9安装包

    - **空格分隔元组赋值**:Python 3.9引入了一种新的语法,允许在元组赋值中使用空格来分隔元素,使得代码更易读。 ```python a, b = 1, 2 # 旧语法 a, b = 1 2 # Python 3.9新语法 ``` - **字符串的比较**:...

    Python-delorean解决Python中有关日期处理的棘手问题的库

    Python是一种广泛使用的编程语言,尤其在数据处理和Web开发领域,而日期和时间操作是编程中常见的需求。在Python的标准库中,虽然有`datetime`模块来处理日期和时间,但在某些复杂场景下,它的功能可能显得不足。这...

    Python3.9.1中文文档.pdf

    这是一种更为直观和方便的数据合并方式。 2. 新增用于移除前缀和后缀的字符串方法:字符串类型新增了两个方法,分别是removeprefix()和removesuffix(),这些方法允许你从字符串的开头或结尾移除指定的前缀或后缀。 ...

    python3.9安装包.rar

    - **zoneinfo模块**:Python 3.9引入了一个新的`zoneinfo`模块,提供了对时区信息的内置支持,不再需要依赖第三方库如pytz。 - **os.scandir()的改进**:`os.scandir()`函数现在更高效,返回一个迭代器,可以更...

    Python-arrow更好的Python日期时间操作类库

    `arrow`库的核心理念是提供一种更加符合人类直觉的方式来创建、解析、操作和格式化时间。它引入了一些高级功能,如时区处理、更方便的区间操作和更易于读写的字符串表示。下面我们将详细介绍`arrow`库的一些关键特性...

    多时区时钟的设计实现

    4. 计时器功能:提供正计时和倒计时两种模式,满足用户不同的时间管理需求。计时器功能可能需要一个后台服务来持续运行,即使在应用程序被最小化或手机屏幕关闭的情况下也能继续计时。 实现这些功能需要熟练掌握...

    生成条形柱状圆形图 和 时区

    "生成条形柱状圆形图 和 时区"这一主题涵盖了两种常用的数据可视化图表类型,以及时间区域的处理。这里我们将深入探讨这些概念。 首先,让我们来看看条形图和柱状图。这两种图表都是用来比较不同类别数据的有效工具...

    python数据分析模块全集

    Python 2和3在语法和标准库上存在较大差异,Six提供了一个简单的接口,使得代码可以在两个版本之间无缝迁移。这对于需要同时支持多个Python版本的数据分析项目尤其重要。 安装这些模块通常通过Python的包管理器pip...

    Python3.7.3编程软件 32位和64位

    9. **新的标准库模块**:Python 3.7增加了几个新的标准库模块,例如`zoneinfo`,用于处理时区信息。 压缩包中的两个文件`python-3.7.3-amd64.exe`和`python-3.7.3.exe`分别是64位和32位的Python 3.7.3安装程序。64...

    python最新安装包3-9-2.rar

    Python是一种广泛使用的高级编程语言,以其易读性、简洁性和丰富的库支持而闻名。Python 3.9.2是Python语言的一个重要版本,它在3.x系列中提供了许多改进和新特性。本安装包适用于Windows 7以上的操作系统,特别是...

    Python datetime 如何处理时区信息

    另一种方式是存储 UTC(协调世界时)时间,它也是无时区信息的,但是相对于人类可读性更强。 2. **存储带有时区信息的时间**:服务端存储带有时区信息的时间字符串,如 ISO 格式 2020-07-07T13:46:08.342+08:00。...

    GPT+Python应用程序实战.pdf

    在这个时差程序中,`get_time()`函数获取指定时区的当前时间,`update_time()`函数负责更新并显示时间信息,包括两个城市的日期和24小时制时间。通过比较当前时间和睡眠/清醒时间点,程序计算并显示剩余的睡眠或清醒...

    Python转换时间的图文方法

    首先,时间戳是表示时间的一种方式,它以自1970年1月1日00:00:00(UTC)以来的秒数来表示时间。在Python中,可以使用`time.time()`函数获取当前时间的时间戳。这个函数没有参数,返回值是浮点数,表示从1970年至今的...

    python-3.7.4.zip

    这个压缩包包含了适用于两种不同体系结构的安装程序:`python-3.7.4-amd64.exe`是为64位(x86_64)的Windows操作系统设计的,而`python-3.7.4.exe`则适用于32位(x86)系统。在选择安装包时,用户应确保根据他们的...

    python3.rar

    Python 3 是一种广泛使用的高级编程语言,以其易读性、简洁性和强大的功能而闻名。在本压缩包“python3.rar”中,包含的是Python 3.9.4的安装资源,这是一个重要的版本更新,提供了许多性能优化和新特性。 Python ...

    python-3.7.3-amd64.rar

    Python 3.7.3是Python编程语言的一个重要版本,发布于2019年,为用户提供了许多增强和改进。这个"python-3.7.3-amd64.rar"压缩包包含了适用于AMD64架构(即64位Windows系统)的Python 3.7.3官方安装程序。对于那些...

    python环境3.9.12

    Python 是一种广泛使用的高级编程语言,以其易读性、可维护性和丰富的标准库而闻名。在 Python 3.9.12 中,我们可以探讨以下几个关键知识点: 1. **语法改进**: - 字符串解析增强:Python 3.9 引入了新的 `|` ...

    python中pandas处理日期时间

    有两种方法可以将字符串转换为日期时间对象: 1. 在`read_csv()`函数中使用`parse_dates`参数。例如: ```python rides = pd.read_csv('capital-onebike.csv', parse_dates=['Start date', 'End date']) ``` 这...

    python3.9.tar.gz

    这个`.tar.gz`文件是一种常见的Linux/Unix平台上的归档压缩格式,它结合了`tar`(归档)和`gzip`(压缩)两个工具的功能。`.tar`用于将多个文件和目录打包成一个单一的归档文件,而`.gz`则对这个归档文件进行压缩,...

Global site tag (gtag.js) - Google Analytics