在python中,時間要做本地化,可以用pytz模組獲取時區物件(datetime.timezone),如果用django的話,django.utils.timezone中的get_default_timezone等方法也是呼叫了pytz返回時區物件的。
而pytz模組中,中國的時區有幾個,通常都是選擇』asia/shanghai』 這個時區,而這個上海的時區物件,是個lmt物件,即本地平均時間,跟標準的東八區時間差了6分鐘,它實際上代表了上海日出日落的地理時間。
那麼如果我們直接用這個時區,呼叫datetime.replace(),修改時區資訊,就會導致時間差6分鐘
>>
>
import pytz
>>
>
from datetime import datetime
>>
>
from django.utils import timezone
>>
> pytz.all_timezones
[… 'asia/shanghai』,..
.]>>
> pytz.timezone(『asia/shanghai』)
06:00 std>
>>
> dt = datetime.now(
)datetime.datetime(
2020,9
,25,8
,26,23
,589608
)>>
> dt.replace(tzinfo=tz)
datetime.datetime(
2020,9
,25,8
,26,23
,589608
, tzinfo=
06:00 std>
)>>
>
print
(dt.replace(tzinfo=tz)
)# replace 的問題,時區不對
2020-09
-2508:
26:23.589608+08
:06>>
> dt.astimezone(tz)
datetime.datetime(
2020,9
,25,8
,26,23
,589608
, tzinfo=
00:00 std>
)>>
>
print
(dt.astimezone(tz)
)# 正確的結果
2020-09
-2508:
26:23.589608+08
:00
1、給無時區的時間加本地時區, 使用 tz.localize(t)
>>
> dt = datetime.strptime(
'2020-10-01 08:20:00'
,'%y-%m-%d %h:%m:%s'
)datetime.datetime(
2020,10
,1,8
,20)>>
> tz = timezone.get_default_timezone(
)>>
> tz.localize(dt)
datetime.datetime(
2020,10
,1,8
,20, tzinfo=
00:00 std>
)>>
> dt.strftime(
'%y-%m-%d %h:%m:%s%z'
)2020-10
-0108:
20:00+
0800
2、給有時區的時間轉換時區, 使用 t.astimezone(tz)
>>
> dt = datetime.strptime(
'2020-10-01 08:20:00+0800'
,'%y-%m-%d %h:%m:%s%z'
)datetime.datetime(
2020,10
,1,8
,20, tzinfo=datetime.timezone(datetime.timedelta(0,
28800))
)>>
> dt.astimezone(timezone.utc)
datetime.datetime(
2020,10
,1,0
,20, tzinfo=
)>>
> tz = timezone.get_default_timezone(
)>>
> dt.astimezone(tz)
datetime.datetime(
2020,10
,1,8
,20, tzinfo=
00:00 std>
)
ps:日期和時間合併,指定時區的方法
>>
> dt = datetime.now(
)datetime.datetime(
2020,9
,25,9
,11,53
,221663
)>>
> d = dt.date(
)datetime.date(
2020,9
,25)>>
> t = dt.time(
)datetime.time(9,
11,53,
221663
)>>
> datetime.combine(d, t)
datetime.datetime(
2020,9
,25,9
,11,53
,221663
)>>
> tz = timezone.get_default_timezone(
)>>
> datetime.combine(d, t, tzinfo=tz)
# 錯誤的
datetime.datetime(
2020,9
,25,9
,11,53
,221663
, tzinfo=
06:00 std>
)>>
> tz.localize(datetime.combine(d, t)
)# 正解
datetime.datetime(
2020,9
,25,9
,11,53
,221663
, tzinfo=
00:00 std>
)
python處理多時區相關問題
隨著國際化的需求越來越多,在考慮多語言的同時也不可避免的要涉及到多時區的問題。python中對多語言也就是i18n的支援要好很多,但在多時區的處理上就稍微差一些,python標準庫中雖然在datetime提供了tzinfo 但很可惜只是乙個abstract class,使用者需要自己實現tzinfo...
處理涉及時區的問題
1.有時會出現這樣的問題,本地 跑的很正常,到了伺服器上卻出現了問題,而且這種問題每次還很棘手,不好定位,這種問題很多都是因為時區不一致導致的 2.對於涉及時區的問題,都應該使用pyzt模組來解決,這個python包提供了奧爾森時區資料庫,這也是許多語言和作業系統所使用的時區資訊標準。3.pyzt模...
程式中時區的問題
time 函式返回自從 unix 紀元 格林威治時間 1970 年 1 月 1 日 00 00 00 到當前時間的秒數。但是你會發現返回的秒數少了8個小時,這是因為系統的預設時區是東八區,格林威治時間 1970 年 1 月 1 日 00 00 00對應的是北京時間 1970 年 1 月 1 日 08...