PYTHON中的時區處理,LMT差6分鐘的問題解決

2021-10-09 18:24:35 字數 3344 閱讀 7477

在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...