python datetime时区转换

From: http://www.dannysite.com/blog/122/

Python标准库中的datetime模块提供了各种对日期和时间的处理方法。从本文的主题着手,首先利用datetime中提供的utcnow()方法获取到当前UTC时间:

1
2
3
4
>>>  import  datetime
>>> utc_now  =  datetime.datetime.utcnow()
>>> utc_now
datetime.datetime( 2013 12 4 15 43 21 872000 )

而此时其tzinfo为none:

1
2
>>> utc_now.tzinfo
>>>

当涉及国际时区时,时区转换则会经常使用到,比如来尝试将刚才的UTC时间转换为本地时间。对于Python3.3+版本,可以这么做:

1
2
>>> utc_now.replace(tzinfo = datetime.timezone.utc).astimezone(tz = None )
datetime.datetime( 2013 12 4 23 43 21 872000 , tzinfo = datetime.timezone(datetime.timedelta( 0 28800 ),  '中国标准时间' ))

不过该方法貌似并不方便,特别是在转换其他时区的时候。而对于更低版本的Python,则datetime.timezone可能压根就还没有。因此更便捷的方法是借助第三方包来实现 —— pyzt,下面就借助于它来实现时区转换:

1
2
3
4
5
6
7
8
>>>  from  pytz  import  timezone
>>> utc_now.tzinfo
>>> tzchina  =  timezone( 'Asia/Chongqing' )
>>> tzchina
<DstTzInfo  'Asia/Chongqing'  LMT + 7 : 06 : 00  STD>
>>> utc  =  timezone( 'UTC' )
>>> utc_now.replace(tzinfo = utc).astimezone(tzchina)
datetime.datetime( 2013 12 4 23 43 21 872000 , tzinfo = <DstTzInfo  'Asia/Chongqing'  CST + 8 : 00 : 00  STD>)

要转换为其他时区,则以此类推。

对于我自己来说,时区的转换主要出现在Django中,会经常需要将UTC时间转换为本地时间,而Django本身也已经为我们考虑到了这一点,因此实际操作起来更为方便:

1
2
3
4
5
>>>  from  django.utils.timezone  import  utc
>>>  from  django.utils.timezone  import  localtime
>>> now  =  datetime.datetime.utcnow().replace(tzinfo = utc)
>>> localtime(now)
datetime.datetime( 2013 12 5 0 3 13 122000 , tzinfo = <DstTzInfo  'Asia/Shanghai'  CST + 8 : 00 : 00  STD>)

在Python中转换时区的方法还有很多,通过探索也许还能找到更好的方法。

from pytz import timezone

def datetime_as_timezone(date_time, time_zone):
    tz = timezone(time_zone)
    utc = timezone('UTC')
    return date_time.replace(tzinfo=utc).astimezone(tz)


def datetime_to_str(date_time):
    date_time_tzone = datetime_as_timezone(date_time, 'Asia/Shanghai')
    return '{0:%Y-%m-%d %H:%M}'.format(date_time_tzone)

From: http://www.dannysite.com/blog/122/

Python标准库中的datetime模块提供了各种对日期和时间的处理方法。从本文的主题着手,首先利用datetime中提供的utcnow()方法获取到当前UTC时间:

1
2
3
4
>>>  import  datetime
>>> utc_now  =  datetime.datetime.utcnow()
>>> utc_now
datetime.datetime( 2013 12 4 15 43 21 872000 )

而此时其tzinfo为none:

1
2
>>> utc_now.tzinfo
>>>

当涉及国际时区时,时区转换则会经常使用到,比如来尝试将刚才的UTC时间转换为本地时间。对于Python3.3+版本,可以这么做:

1
2
>>> utc_now.replace(tzinfo = datetime.timezone.utc).astimezone(tz = None )
datetime.datetime( 2013 12 4 23 43 21 872000 , tzinfo = datetime.timezone(datetime.timedelta( 0 28800 ),  '中国标准时间' ))

不过该方法貌似并不方便,特别是在转换其他时区的时候。而对于更低版本的Python,则datetime.timezone可能压根就还没有。因此更便捷的方法是借助第三方包来实现 —— pyzt,下面就借助于它来实现时区转换:

1
2
3
4
5
6
7
8
>>>  from  pytz  import  timezone
>>> utc_now.tzinfo
>>> tzchina  =  timezone( 'Asia/Chongqing' )
>>> tzchina
<DstTzInfo  'Asia/Chongqing'  LMT + 7 : 06 : 00  STD>
>>> utc  =  timezone( 'UTC' )
>>> utc_now.replace(tzinfo = utc).astimezone(tzchina)
datetime.datetime( 2013 12 4 23 43 21 872000 , tzinfo = <DstTzInfo  'Asia/Chongqing'  CST + 8 : 00 : 00  STD>)

要转换为其他时区,则以此类推。

对于我自己来说,时区的转换主要出现在Django中,会经常需要将UTC时间转换为本地时间,而Django本身也已经为我们考虑到了这一点,因此实际操作起来更为方便:

1
2
3
4
5
>>>  from  django.utils.timezone  import  utc
>>>  from  django.utils.timezone  import  localtime
>>> now  =  datetime.datetime.utcnow().replace(tzinfo = utc)
>>> localtime(now)
datetime.datetime( 2013 12 5 0 3 13 122000 , tzinfo = <DstTzInfo  'Asia/Shanghai'  CST + 8 : 00 : 00  STD>)

在Python中转换时区的方法还有很多,通过探索也许还能找到更好的方法。

from pytz import timezone

def datetime_as_timezone(date_time, time_zone):
    tz = timezone(time_zone)
    utc = timezone('UTC')
    return date_time.replace(tzinfo=utc).astimezone(tz)


def datetime_to_str(date_time):
    date_time_tzone = datetime_as_timezone(date_time, 'Asia/Shanghai')
    return '{0:%Y-%m-%d %H:%M}'.format(date_time_tzone)

猜你喜欢

转载自www.cnblogs.com/presleyren/p/10310859.html
今日推荐