1. 程式人生 > >筆記-python-standard library-8.1 data types-datetime

筆記-python-standard library-8.1 data types-datetime

none struct supported 方法 all min lag ons ros

筆記-python-standard library-8.1 data types-datetime

1. Datatimes

本章節內容為日期和時間處理類和方法。

1.1. datetime-basic date and time types

source code: Lib/datetime.py

datetime模塊提供了日期和時間處理類,重點是各種格式化的輸出。

時間包括兩種,世界時和當地時間。

datetime和time對象可以選定時區。

datetime模塊提供了下列常量:

datetime.MINYEAR,datetime.MAXYEAR分別是1和9999。

相關模塊calendar日歷功能,time時間訪問和轉換

1.1.1. 可用的類型

datetime.date:表示日期

datetime.time:表示時間

datetime.datetime:表示日期+時間

datetime.timedelta:表示兩個日期,時間或日期+時間之間的差值

datetime.tzinfo:時區相關信息

datetime.timezone

類繼承關系圖:

object

timedelta

tzinfo

timezone

time

date

datetime

1.1.2. timedelta objects

timedelta:兩個時間之差。

class datetime.timedelta(days=0, seconds=0,microseconds=0,milliseconds=0,minutes=0, hours=0,weeks=0)

實例屬性(只讀):

Attribute

Value

days

Between -999999999 and 999999999 inclusive

seconds

Between 0 and 86399 inclusive

microseconds

Between 0 and 999999 inclusive

支持的操作

t1 = t2+t3 or t1= t2-t3

t1= t2*I

f = t2/t3

return a float object

t1 = t2//i

t1 = t2%t3

q,r = divmod(t1,t2)

實例方法:

timedelta.total_seconds() 返回時間差,以秒為單位。

1.1.3. date objects

class datetime.date(year,month,day)

class methods:

date.today() 返回當日日期

date.fromtimestamp(timestamp) 根據時間戳返回日期

date.fromordinal(ordinal) 將Gregorian日歷時間轉換為date對象

class attributes:

date.year, date.month, date.day

supported operations:

Operation

Result

date2 = date1 + timedelta

date2 is timedelta.days days removed from date1. (1)

date2 = date1 - timedelta

Computes date2 such that date2 + timedelta == date1. (2)

timedelta = date1 - date2

(3)

date1 < date2

date1 is considered less than date2 when date1 precedes date2 in time. (4)

instance methods:

date.replace(year=self.year, month=self.month, day=self.day)

根據參數返回一個替代後的日期。

date.timetuple()

Return a time.struct_time such as returned by time.localtime(). The hours, minutes and seconds are 0, and the DST flag is -1. d.timetuple()is equivalent to time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1)), where yday = d.toordinal() - date(d.year, 1,1).toordinal() + 1 is the day number within the current year starting with 1 for January 1st.

示例:

>>> a = datetime.date(2017,3,22)

>>> a.timetuple() time.struct_time(tm_year=2017, tm_mon=3, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=81, tm_isdst=-1)

>>> a.timetuple().tm_year

2017

>>> a.timetuple().tm_mon

3

>>> a.timetuple().tm_mday

22

date.weekday()

以數值形式返回星期,註意星期一是0,星期天是6。

date.isoweekday()

與上一函數相同,但星期數值是1-7

date.isocalendar()

Return a 3-tuple, (ISO year, ISO week number, ISO weekday).

date.isoformat()

Return a string representing the date in ISO 8601 format, ‘YYYY-MM-DD’. For example, date(2002, 12, 4).isoformat() == ‘2002-12-04‘.

date.__str__()

等效於date.isoformat()

date.ctime()

返回特定格式的日期 date(2002, 12, 4).ctime() == ‘Wed Dec 4 00:00:00 2002‘.

date.strftime(format)

date.__format__(format)

都是返回特定格式的日期字符串。

下面是一些日期格式轉換的示例:

>>> from datetime import date

>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001

>>> d

datetime.date(2002, 3, 11)

>>> t = d.timetuple()

>>> for i in t:

... print(i)

2002 # year

3 # month

11 # day

0

0

0

0 # weekday (0 = Monday)

70 # 70th day in the year

-1

>>> ic = d.isocalendar()

>>> for i in ic:

... print(i)

2002 # ISO year

11 # ISO week number

1 # ISO day number ( 1 = Monday )

>>> d.isoformat()

‘2002-03-11‘

>>> d.strftime("%d/%m/%y")

‘11/03/02‘

>>> d.strftime("%A %d. %B %Y")

‘Monday 11. March 2002‘

>>> ‘The {1} is {0:%d}, the {2} is {0:%B}.‘.format(d, "day", "month")

‘The day is 11, the month is March.‘

1.1.4. datetime objects

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

class methods:

datetime.today()

返回日期時間,結果如下:datetime.datetime(2018, 9, 29, 21, 16, 9, 954626)

datetime.now(tz=None)

返回日期時間,如果tz非空,返回一個tzinfo子類,時間進行轉換。

datetime.utcnow() 返回utc時間。

datetime.fromtimestamp(timestamp, ta=None) 根據給出的時間戳返回時日期時間。

datetime.utcfromtimestamp(timestamp) 返回utc日期時間

datetime.fromordinal(ordinal) 返回Gregorian日期時間

datetime.combine(date,time.tzinfo=self.tzinfo) 將date和time對象合並成datetime對象

datetime.strptime(date_string, format) 根據參數,返回datetime對象

class attributes:

datetime.year

datetime.month

datetime.day

datetime.hour

datetime.minute

datetime.second

datetime.microsecond

datetime.tzinfo

datetime.fold

support operations:

Operation

Result

datetime2 = datetime1 + timedelta

(1)

datetime2 = datetime1 - timedelta

(2)

timedelta = datetime1 - datetime2

(3)

datetime1 < datetime2

Compares datetime to datetime. (4)

instance methods:

date(),time(),timetz(),

replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0)

astimezone(tz=None)

utcoffset(), dst(),tzname(), timetuple(),utctimetuple()

timestamp()

weekday()

isoweekday()

isocalendar()

isoformat(sep=’T’, timespec=’auto’)

__str__()

ctime()

strftime(format)

__format__(format)

Examples of working with datetime objects:

>>>

>>> from datetime import datetime, date, time

>>> # Using datetime.combine()

>>> d = date(2005, 7, 14)

>>> t = time(12, 30)

>>> datetime.combine(d, t)

datetime.datetime(2005, 7, 14, 12, 30)

>>> # Using datetime.now() or datetime.utcnow()

>>> datetime.now()

datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1

>>> datetime.utcnow()

datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)

>>> # Using datetime.strptime()

>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")

>>> dt

datetime.datetime(2006, 11, 21, 16, 30)

>>> # Using datetime.timetuple() to get tuple of all attributes

>>> tt = dt.timetuple()

>>> for it in tt:

... print(it)

...

2006 # year

11 # month

21 # day

16 # hour

30 # minute

0 # second

1 # weekday (0 = Monday)

325 # number of days since 1st January

-1 # dst - method tzinfo.dst() returned None

>>> # Date in ISO format

>>> ic = dt.isocalendar()

>>> for it in ic:

... print(it)

...

2006 # ISO year

47 # ISO week

2 # ISO weekday

>>> # Formatting datetime

>>> dt.strftime("%A, %d. %B %Y %I:%M%p")

‘Tuesday, 21. November 2006 04:30PM‘

>>> ‘The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.‘.format(dt, "day", "month", "time")

‘The day is 21, the month is November, the time is 04:30PM.‘

Using datetime with tzinfo:

>>>

>>> from datetime import timedelta, datetime, tzinfo

>>> class GMT1(tzinfo):

... def utcoffset(self, dt):

... return timedelta(hours=1) + self.dst(dt)

... def dst(self, dt):

... # DST starts last Sunday in March

... d = datetime(dt.year, 4, 1) # ends last Sunday in October

... self.dston = d - timedelta(days=d.weekday() + 1)

... d = datetime(dt.year, 11, 1)

... self.dstoff = d - timedelta(days=d.weekday() + 1)

... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:

... return timedelta(hours=1)

... else:

... return timedelta(0)

... def tzname(self,dt):

... return "GMT +1"

...

>>> class GMT2(tzinfo):

... def utcoffset(self, dt):

... return timedelta(hours=2) + self.dst(dt)

... def dst(self, dt):

... d = datetime(dt.year, 4, 1)

... self.dston = d - timedelta(days=d.weekday() + 1)

... d = datetime(dt.year, 11, 1)

... self.dstoff = d - timedelta(days=d.weekday() + 1)

... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:

... return timedelta(hours=1)

... else:

... return timedelta(0)

... def tzname(self,dt):

... return "GMT +2"

...

>>> gmt1 = GMT1()

>>> # Daylight Saving Time

>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)

>>> dt1.dst()

datetime.timedelta(0)

>>> dt1.utcoffset()

datetime.timedelta(0, 3600)

>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)

>>> dt2.dst()

datetime.timedelta(0, 3600)

>>> dt2.utcoffset()

datetime.timedelta(0, 7200)

>>> # Convert datetime to another time zone

>>> dt3 = dt2.astimezone(GMT2())

>>> dt3

datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>)

>>> dt2

datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>)

>>> dt2.utctimetuple() == dt3.utctimetuple()

True

1.1.5. time objects

class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

instance attributes(read-only):

hour,minute,second,microsecond,tzinfo,fold

supported operations:

  1. comparison of time to time.
  2. hash, use as dict key
  3. efficent pickling

instance methods:與date,datetime沒什麽太大不同,不重復了。

1.1.6. strftime() and strptime() behavior

Directive

Meaning

Example

%a

Weekday as locale’s abbreviated name.

Sun, Mon, …, Sat (en_US);

So, Mo, …, Sa (de_DE)

%A

Weekday as locale’s full name.

Sunday, Monday, …, Saturday (en_US);

Sonntag, Montag, …, Samstag (de_DE)

%w

Weekday as a decimal number, where 0 is Sunday and 6 is Saturday.

0, 1, …, 6

%d

Day of the month as a zero-padded decimal number.

01, 02, …, 31

%b

Month as locale’s abbreviated name.

Jan, Feb, …, Dec (en_US);

Jan, Feb, …, Dez (de_DE)

%B

Month as locale’s full name.

January, February, …, December (en_US);

Januar, Februar, …, Dezember (de_DE)

%m

Month as a zero-padded decimal number.

01, 02, …, 12

%y

Year without century as a zero-padded decimal number.

00, 01, …, 99

%Y

Year with century as a decimal number.

0001, 0002, …, 2013, 2014, …, 9998, 9999

%H

Hour (24-hour clock) as a zero-padded decimal number.

00, 01, …, 23

%I

Hour (12-hour clock) as a zero-padded decimal number.

01, 02, …, 12

%p

Locale’s equivalent of either AM or PM.

AM, PM (en_US);

am, pm (de_DE)

%M

Minute as a zero-padded decimal number.

00, 01, …, 59

%S

Second as a zero-padded decimal number.

00, 01, …, 59

%f

Microsecond as a decimal number, zero-padded on the left.

000000, 000001, …, 999999

%z

UTC offset in the form +HHMM or -HHMM (empty string if the object is naive).

(empty), +0000, -0400, +1030

%Z

Time zone name (empty string if the object is naive).

(empty), UTC, EST, CST

%j

Day of the year as a zero-padded decimal number.

001, 002, …, 366

%U

Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0.

00, 01, …, 53

%W

Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0.

00, 01, …, 53

%c

Locale’s appropriate date and time representation.

Tue Aug 16 21:30:00 1988 (en_US);

Di 16 Aug 21:30:00 1988 (de_DE)

%x

Locale’s appropriate date representation.

08/16/88 (None);

08/16/1988 (en_US);

16.08.1988 (de_DE)

%X

Locale’s appropriate time representation.

21:30:00 (en_US);

21:30:00 (de_DE)

%%

A literal ‘%‘ character.

%

筆記-python-standard library-8.1 data types-datetime