日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

DateTime的時區問題

Python/ target=_blank class=infotextkey>Python的datetime可以處理2種類型的時間,分別為offset-naive和offset-aware。前者是指沒有包含時區信息的時間,后者是指包含時區信息的時間,只有同類型的時間才能進行減法運算和比較。

 

datetime模塊的函數在默認情況下都只生成offset-naive類型的datetime對象,例如now()、utcnow()、fromtimestamp()、utcfromtimestamp()和strftime()。

其中now()和fromtimestamp()可以接受一個tzinfo對象來生成offset-aware類型的datetime對象,但是標準庫并不提供任何已實現的tzinfo類,只能自己實現。

一旦生成了一個offset-aware類型的datetime對象,我們就能調用它的astimezone()方法,生成其他時區的時間(會根據時差來計算)。

而如果拿到的是offset-naive類型的datetime對象,也是可以調用它的replace()方法來替換tzinfo的,只不過這種替換不會根據時差來調整其他時間屬性。

因此,如果拿到一個格林威治時間的offset-naive類型的datetime對象,直接調用replace(tzinfo=UTC())即可轉換成offset-aware類型,然后再調用astimezone()生成其他時區的datetime對象。

不帶時區datetime實例
普通的datetime都是不帶時區信息

>>> from datetime import datetime
>>> datetime_now = datetime.now()
>>> 
>>> datetime_now
datetime.datetime(2023, 1, 10, 14, 29, 3, 6825)

帶時區datetime實例

>>> import pytz
>>> datetime_now = datetime.now(tz=pytz.utc)
>>> datetime_now
datetime.datetime(2023, 1, 10, 6, 30, 18, 694175, tzinfo=<UTC>)

 

pendulum

pendulum是對datetime的高級封裝,主要是用的是帶時區的datetime

>>> import pendulum
>>> from datetime import datetime
>>> now = pendulum.now()
>>> now
DateTime(2023, 1, 10, 14, 32, 18, 906761, tzinfo=Timezone('Asia/Shanghai'))
>>> 
>>> isinstance(now, datetime)
True

 

創建DateTime實例

pendulum是簡化時間操作的模塊。
特別注意確保正確處理時區,并基于底層tzinfo實現。例如,所有比較均以UTC或所用日期時間的時區進行。pendulum默認創建帶時區的datetime,但時區并不是當地時區,而是標準時區UTC時區。

創建

>>>dt = pendulum.datetime(2023, 1, 10)
>>>dt
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('UTC'))

如果沒有指明時分秒,那么就是00:00:00,并且時區是UTC。此外它也可以是Timezone實例或一個簡單的時區字值

local
local 和 datetime()很類似,但是會自動設置時區為本地時區

>>>dt = pendulum.local(2023,1,10)
>>>dt
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

now
now 和 local一樣,也會自動設置時區為本地時區

>>>now = pendulum.now()
>>>now
DateTime(2023, 1, 10, 14, 43, 42, 782703, tzinfo=Timezone('Asia/Shanghai'))

tomorrow
獲取明天的起始時間,零時零點。帶時區

>>>tomm = pendulum.tomorrow()
>>>tomm
DateTime(2023, 1, 11, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

yesterday
獲取昨天的起始時間,零時零點,帶時區

>>>yes = pendulum.yesterday()
>>>yes
DateTime(2023, 1, 9, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

naive 不帶時區實例
pendulum是強制使用時區的,使用它們是使用庫的首選和推薦方式。但是如果你真的需要一個簡單的DateTime對象,可以使用naive()

>>>>>>naive = pendulum.naive(2023, 1, 10, 14, 47, 23)
>>>naive
DateTime(2023, 1, 10, 14, 47, 23)

從字符串創建

form_format
form_format和原生的datetime.strptime()很類似,但使用自定義標記創建DateTime實例

>>> dt = pendulum.from_format('1975-05-21 22', 'YYYY-MM-DD HH')
>>> dt
DateTime(1975, 5, 21, 22, 0, 0, tzinfo=Timezone('UTC'))

同樣可以接受一個時區

>>> dt = pendulum.from_format('1975-05-21 22', 'YYYY-MM-DD HH', tz='Asia/Shanghai')>>> 
>>> dt
DateTime(1975, 5, 21, 22, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

form_timestamp
最后一個助手用于處理unix時間戳。from_timestamp()將創建一個與給定時間戳相等的DateTime實例,并設置時區或將其默認為UTC。

>>>dt = pendulum.from_timestamp(1673334526.330153)
>>>dt
DateTime(2023, 1, 10, 7, 8, 46, 330153, tzinfo=Timezone('UTC'))

parse
pendulum.parse() 可以將字符串轉peewee對象,默認不設置本地時區,可通過tz手動添加時區。字符串格式支持:

  • RFC 3339 format
  • ISO 8601 formats
>>> dt = pendulum.parse('1975-05-21T22:00:00')
>>> print(dt)
'1975-05-21T22:00:00+00:00

pendulum 屬性和方法

pendulum 對象有十分龐大的屬性和方法

 

輸出當前時刻的年月日時分秒

>>> dt.year
2023
>>> dt.month
1
>>> dt.day
10
>>> dt.hour
15
>>> dt.minute
21
>>> dt.second
15
>>> dt.microsecond
737073
>>>

輸出當前時間是一年中的第幾周,第幾天,第幾個月

>>> dt.day_of_week
2
>>> dt.day_of_year
10
>>> dt.week_of_year
2 
>>> dt.days_in_month
31

輸出對象的時區相關時區名字時區類型本地時區或標準時區

>>> dt.timezone
Timezone('Asia/Shanghai')
>>> 
>>> dt.is_local()
True
>>> dt.is_utc()
False

date和time的屬性

date通常是指年月日的時間
time通常是指時分秒的時間
pendulum屬性中可以輸出date和time

date time

>>>dt.now()
DateTime(2023, 1, 10, 15, 28, 37, 242587, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.now().time()
Time(15, 28, 42, 570116)
>>>dt.now().date()
Date(2023, 1, 10)
>>>print(dt.now().time())
15:29:29.355958
>>>type(dt.now().time())
<class 'pendulum.time.Time'>
  >>>type(dt.now().time())
<class 'pendulum.time.Time'>
  >>>print(dt.now().date())
2023-01-10

date,time都不是datetime類型的。所以在一些時間加減運算,比較等操作是date和time都不可以和pendulum直接運算。

字符串輸出格式

date,time,datetime 相關字符串格式的輸出

>>>dt = pendulum.now()
>>>dt.to_date_string()
'2023-01-10'
>>>dt.to_time_string()
'15:40:47'
>>>dt.to_datetime_string()
'2023-01-10 15:40:47'

自定義輸出格式

>>>dt.format('dddd Do [of] MMMM YYYY HH:mm:ss A')
'Tuesday 10th of January 2023 15:40:47 PM'
>>>dt.strftime('%Y %I:%M:%S %p')
'2023 03:40:47 PM'

format 比 strftime 使用更加直觀,而且支持更多參數

>>> dt.format('YYYY-MM-DD HH:mm:ss')
'2023-01-10 15:40:47'

可以使用的參數:

-

TOKEN

OUTPUT

YEAR

YYYY

2000, 2001, 2002 ... 2012, 2013

 

YY

00, 01, 02 ... 12, 13

 

Y

2000, 2001, 2002 ... 2012, 2013

QUARTER

Q

1 2 3 4

 

Qo

1st 2nd 3rd 4th

MONTH

MMMM

January, February, March ...

 

MMM

Jan, Feb, Mar ...

 

MM

01, 02, 03 ... 11, 12

 

M

1, 2, 3 ... 11, 12

 

Mo

1st 2nd ... 11th 12th

DAY OF YEAR

DDDD

001, 002, 003 ... 364, 365

 

DDD

1, 2, 3 ... 4, 5

DAY OF MONTH

DD

01, 02, 03 ... 30, 31

 

D

1, 2, 3 ... 30, 31

 

Do

1st, 2nd, 3rd ... 30th, 31st

DAY OF WEEK

dddd

Monday, Tuesday, Wednesday ...

 

ddd

Mon, Tue, Wed ...

 

dd

Mo, Tu, We ...

 

d

0, 1, 2 ... 6

DAYS OF ISO WEEK

E

1, 2, 3 ... 7

HOUR

HH

00, 01, 02 ... 23, 24

 

H

0, 1, 2 ... 23, 24

 

hh

01, 02, 03 ... 11, 12

 

h

1, 2, 3 ... 11, 12

MINUTE

mm

00, 01, 02 ... 58, 59

 

m

0, 1, 2 ... 58, 59

SECOND

ss

00, 01, 02 ... 58, 59

 

s

0, 1, 2 ... 58, 59

轉義字符

要轉義格式字符串中的字符,可以將字符括在方括號中。

>>>dt.format('[today] dddd')
'today Tuesday'

時間比較

pendulum的時間可以直接比較。但是只能限制在相同對象之間。如datetime和datetime之間可以比較,datetime和date無法比較,帶時區對象和不帶時區對象無法比較。

時間加減運算

有一些需要對時間操作的場景,比如定時4個小時執行一段代碼,這是需要對時間加減運算。時間加減返回DateTime實例,不會造成時區變化。加減運算僅限于同一種類型的時間。

方法:

  1. add 加法
  2. subtract 減法

pendulum支持的加減的時間顆粒度:

  1. years
  2. months
  3. days
  4. hours
  5. minutes
  6. seconds

同時也支持多個參數

>>>dt = pendulum.now()
>>>dt.add(years=1)
DateTime(2024, 1, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract (years=1)
DateTime(2022, 1, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.add(months=2)
DateTime(2023, 3, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract(months=2)
DateTime(2022, 11, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.add(hours=1)
DateTime(2023, 1, 10, 16, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract(hours=1)
DateTime(2023, 1, 10, 14, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))

pendulum常用方法

獲取時區的方法

>>>pendulum.now().timezone.name
'Asia/Shanghai'

轉換時區

>>>pendulum.now().in_timezone('UTC')
DateTime(2023, 1, 10, 7, 57, 33, 12087, tzinfo=Timezone('UTC'))

起始時間

pendulum提供了起始日期的獲取方法

開始時間
獲取一個時間的開始時間,可以為:year,month,day,week

>>>dt = pendulum.now()
>>>dt.start_of('year')
DateTime(2023, 1, 1, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.start_of('month')
DateTime(2023, 1, 1, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>>>>dt.start_of('day')
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.start_of('week')
DateTime(2023, 1, 9, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

截止日期
獲取一個時間的截止日期,可以為year,month,day,week

>>>dt.end_of('year')
DateTime(2023, 12, 31, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('month')
DateTime(2023, 1, 31, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('day')
DateTime(2023, 1, 10, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('week')
DateTime(2023, 1, 15, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))

修改時間

pendulum提供一些幫助,通過對舊實例修改,返回一個新的實例。
但是,除了顯式設置時區外,這些幫助程序都不會更改實例的時區。具體而言,設置時間戳不會將相應的時區設置為UTC

>>> dt = pendulum.now()
>>> dt.set(year=1975, month=5, day=21).to_datetime_string()
'1975-05-21 15:59:29'

in_timezone() in_tz()可以將時間轉化到設置的時區。

>>>dt = pendulum.now()
>>>dt
DateTime(2023, 1, 10, 16, 4, 50, 734603, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.in_timezone('Europe/London')
DateTime(2023, 1, 10, 8, 4, 50, 734603, tzinfo=Timezone('Europe/London'))
>>>dt.in_timezone('UTC')
DateTime(2023, 1, 10, 8, 4, 50, 734603, tzinfo=Timezone('UTC'))

 

本文引自:
https://www.cnblogs.com/goldsunshine/p/15292216.html

分享到:
標簽:python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定