python中datetime怎么设置时区

Python019

python中datetime怎么设置时区,第1张

如果你的程序要考虑时区,可以使用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 the datetimemethods 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>)

时间格式转换分为两种,时间转换为字符串和字符串转换为时间,具体代码例子如下:

    1 import datetime

    2 import time

    3 # 日期转换为字符串,使用strftime()函数

    4 # time.strftime(format[, t])

    5

    6 print datetime.datetime.now()

    7 print datetime.datetime.now().strftime("%Y-%m-%d

%H:%M:%S")

    8 print datetime.datetime.now().strftime("%b

%d %Y %H:%M:%S")

    9 print datetime.datetime.now().strftime("%c

%d %Y %H:%M:%S")

   10 # 字符串转换为日期,使用strptime()函数

   11 t = (2009, 2, 17, 8, 3, 38, 1, 48, 0)

   12 t = time.mktime(t)

   13 print time.strftime("%b %d %Y %H:%M:%S",time.gmtime(t))

   14 print time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(t))

 

注:格式字符说明:

python中时间日期格式化符号:

%y

     两位数的年份表示(00-99)

%Y

     四位数的年份表示(000-9999)

%m

     月份(01-12)

%d

     月内中的一天(0-31)

%H

     24小时制小时数(0-23)

%I

     12小时制小时数(01-12)

%M

     分钟数(00=59)

%S

     秒(00-59)

%a

     本地简化星期名称

%A

     本地完整星期名称

%b

     本地简化的月份名称

%B

     本地完整的月份名称

%c

     本地相应的日期表示和时间表示

%j

     年内的一天(001-366)

%p

     本地A.M.或P.M.的等价符

%U

     一年中的星期数(00-53)星期天为星期的开始

%w

     星期(0-6),星期天为星期的开始

%W

     一年中的星期数(00-53)星期一为星期的开始

%x

     本地相应的日期表示

%X

     本地相应的时间表示

%Z

     当前时区的名称

%%

     %号本身