pytz-時區相關模塊

最近開發過程中遇到這樣一個問題:

在使用datetime模塊獲取當前時間之後,與程序中某些時間操作會報錯:
TypeError: can't subtract offset-naive and offset-aware datetimes

這個我就有點納悶了,怎麼會報這個錯誤呢?然後我開始搜資料,原來在有兩種時間類型:naiveaware

  • naive

    • 沒有表明時區的時間.如: datetime.datetime.now()
    •   datetime.datetime(2019, 7, 8, 14, 13, 52, 534690)
  • aware

    • 有時區的時間.如:datetime.datetime.now(pytz.utc)
    •   datetime.datetime(2019, 7, 8, 6, 22, 16, 245504, tzinfo=<UTC>)

可以發現aware類型時間在打印對象信息時多了一個tzinfo,沒錯,這個就是用來標識時區的.而因爲我們獲取當前的時候沒有傳入時區,爲naive類型,所以與有些aware時間操作會發生異常,其實解決方法也很簡單,將naive轉化爲aware類型就好了,怎樣轉化呢?我找到了這幾種方式:

方式一

datetime.datetime.now().replace(tzinfo=pytz.utc)

方式二

datetime.datetime.now(pytz.utc)

方式三

pytz.utc.localize(datetime.datetime.now())

而第二種生成方式是在創建時間的時候指定時間,其他兩種可以用來轉化/修改時區.寫了這麼多,你們肯定在疑惑一個東西:pytz
這是一個時區模塊,用來在python中進行一個時區的相關操作.其提供的對象方法爲

__all__ = [
    'timezone', 'utc', 'country_timezones', 'country_names',
    'AmbiguousTimeError', 'InvalidTimeError',
    'NonExistentTimeError', 'UnknownTimeZoneError',
    'all_timezones', 'all_timezones_set',
    'common_timezones', 'common_timezones_set',
]

接下來我們一個個介紹:

  • timezone:傳入一個時區,如:Asia/Shanghai,返回一個時區對象

    • pytz.timezone('Asia/Shanghai')
      >>> <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
  • utc: 返回一個utc時區對象

    • pytz.utc
      >>> <UTC>
  • country_timezones:傳入一個國家英文縮寫,返回擁有的時區,如:中國('CN'),不傳則返回由247個國家縮寫爲key,時區爲值的dict

    • pytz.country_timezones('CN')
      >>> [u'Asia/Shanghai', u'Asia/Urumqi']
  • country_names:拿一個國家英文縮寫,返回國家完整英文名稱

    • pytz.country_names['CN']
      >>>  u'China'
  • all_timezones:所有時區的列表(591個)

    • pytz.all_timezones
      >>>  ['Asia/Shanghai', 'Asia/Urumqi', ...] # 有591個,所以還是列一下咱們國家的時區
  • all_timezones_set:所有時區的集合

    • pytz.all_timezones_set
      >>>  {'Asia/Shanghai', 'Asia/Urumqi', ...}
  • common_timezones:常用的時區列表(439個)

    • pytz.common_timezones
      >>>  ['Asia/Shanghai', 'Asia/Urumqi', ...] # 有439個
  • common_timezones_set:常用的時區集合

    • pytz.common_timezones
      >>>  {'Asia/Shanghai', 'Asia/Urumqi', ...}
  • AmbiguousTimeError:模糊時間錯誤
  • InvalidTimeError:無效時間錯誤
  • NonExistentTimeError:不存在的時間錯誤
  • UnknownTimeZoneError:未知的時區錯誤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章