python模塊-pytz時區轉換


pytz模塊常用於時區的轉換,常常配合datetime一起使用。我們知道datetime除了data方法生成的時間是沒有時區概念,其他如time、datetime等都是有時區概念,即指定了tzinfo信息。>>> import datetime

  1.  
    >>> datetime.datetime.now(tz)
  2.  
    datetime.datetime( 2009, 2, 21, 15, 12, 33, 906000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
  3.  
    >>> datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz)
  4.  
    datetime.datetime( 2009, 2, 21, 15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
  5.  
    >>> datetime.date(2009, 2, 21, tzinfo=tz)
  6.  
    Traceback (most recent call last):
  7.  
    File "<stdin>", line 1, in <module>
  8.  
    TypeError: 'tzinfo' is an invalid keyword argument for this function
  9.  
    >>> datetime.time(15, 12, 33, tzinfo=tz)
  10.  
    datetime.time( 15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

時區轉換

  • pytz.country_timezones(‘國家代碼’):此方法可以拿到某個國家的時區名列表。
  1.  
    >>>(pytz.country_timezones('cn')
  2.  
    [ 'Asia/Shanghai', 'Asia/Urumqi']
  • pytz.timezone(‘時區名’):此方法能獲取一個tzinfo對象,該對象可在datetime生成時間中以參數的形式放入,即可生成對應時區的時間。
  1.  
    >>>utc = pytz.timezone('UTC')
  2.  
    >>>datetime.datetime.now(tz=utc)
  3.  
    2019-05-10 10:53:46.000929+00:00

實際上,現在時間為18:53:46

  • 查看有哪些時區

pytz有all_timezones、common_timezones這兩個屬性來查看有哪些時區。

from pytz import all_timezones,common_timezones
  • 時間按時區轉換

這要用到datetime模塊的astimezone方法來實現。如下所示,開始生成本地時間,然后在轉成utc時間。

  1.  
    import datetime
  2.  
    import pytz
  3.  
    utc = pytz.timezone(' UTC')
  4.  
    now_time = datetime.datetime.now()
  5.  
    utc_time = now_time.astimezone(tz=utc)
  6.  
    print(now_time,utc_time)
2019-05-10 19:02:53.499513 2019-05-10 11:02:53.499513+00:00

對於有采用了夏時制的要使用時區對象的normzlize方法來處理,如下所示:

  1.  
    import datetime
  2.  
    import pytz
  3.  
    utc = pytz.timezone(' UTC')
  4.  
    now_time = datetime.datetime.now()
  5.  
    utc_time = utc.normalize(now_time.astimezone(tz=utc))
  6.  
    print(now_time,utc_time)
2019-05-10 19:08:25.286690 2019-05-10 11:08:25.286690+00:00
  • LMT問題

LMT,這是Local Mean Time的縮寫,網上查一查意思是本地平均時。而且時間是+8:06,說明與UTC的時差不是8個小時整。下面有一個問題是,當我們用pytz.timezone('Asia/Shanghai') 生成的時區是LMT,而非標准的CST(就是Central Standard Time的意思)。那么這會造成什么后果呢?下面來展示下:

  1.  
    >>>tz = pytz.timezone('Asia/Shanghai')
  2.  
    >>>tz
  3.  
    <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
  4.  
    >>>d = datetime.datetime(2019,5,10,19,12,30,tzinfo=tz)
  5.  
    >>>d
  6.  
    datetime.datetime( 2019, 5, 10, 19, 12, 30, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
  7.  
    >>>d = d.astimezone(utc)
  8.  
    >>>d
  9.  
    datetime.datetime( 2019, 5, 10, 11, 6, 30, tzinfo=<UTC>)
  10.  
    >>>d.astimezone(tz)
  11.  
    datetime.datetime( 2019, 5, 10, 19, 6, 30, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

由上述可以發現,剛開始由datetime.datetime()生成的時間是LMT,接下來我將其轉換為UTC時區的時間,最后又轉回來,我們可以發現,現在的時間又變成了CST標准。而這兩個標准,就直接導致其相差了6分鍾。

下面我們可以用時區對象的localize方法,將LMT准換為CST,使其統一。

  1.  
    >>>datetime.datetime(2019,5,10,20,30,32,tzinfo=tz)
  2.  
    datetime.datetime( 2019, 5, 10, 20, 30, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
  3.  
    >>>tz.localize(datetime.datetime(2019,5,10,20,30,32))
  4.  
    datetime.datetime( 2019, 5, 10, 20, 30, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

所以我的建議是生成帶時區的時間時,一定要使用timezone.localize()來生成。不要在時間對象的構造函數中傳入tzinfo的方式來實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM