datetime
--- Basic date and time types¶
ソースコード: Lib/datetime.py
datetime
モジュールは、日付や時刻を操作するためのクラスを提供しています。
日付や時刻に対する算術がサポートされている一方、実装では出力のフォーマットや操作のための効率的な属性の抽出に重点を置いています。
Tip
書式コード に飛ぶ。
参考
calendar
モジュール汎用のカレンダー関連関数。
time
モジュール時刻へのアクセスと変換。
zoneinfo
モジュールIANAタイムゾーンデータベースを表す具体的なタイムゾーン。
- dateutil パッケージ
拡張タイムゾーンと構文解析サポートのあるサードパーティーライブラリ。
- Package DateType
Third-party library that introduces distinct static types to e.g. allow static type checkers to differentiate between naive and aware datetimes.
Aware オブジェクトと Naive オブジェクト¶
Date and time objects may be categorized as "aware" or "naive" depending on whether or not they include timezone information.
タイムゾーンや夏時間の情報のような、アルゴリズム的で政治的な適用可能な時間調節に関する知識を持っているため、 aware オブジェクトは他の aware オブジェクトとの相対関係を特定できます。 aware オブジェクトは解釈の余地のない特定の実時刻を表現します。 [1]
A naive object does not contain enough information to unambiguously locate itself relative to other date/time objects. Whether a naive object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program, just like it is up to the program whether a particular number represents metres, miles, or mass. Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality.
aware オブジェクトを必要とするアプリケーションのために、 datetime
と time
オブジェクトは追加のタイムゾーン情報の属性 tzinfo
を持ちます。
tzinfo
には抽象クラス tzinfo
のサブクラスのインスタンスを設定できます。
これらの tzinfo
オブジェクトは UTC 時間からのオフセットやタイムゾーンの名前、夏時間が実施されるかどうかの情報を保持しています。
Only one concrete tzinfo
class, the timezone
class, is
supplied by the datetime
module. The timezone
class can
represent simple timezones with fixed offsets from UTC, such as UTC itself or
North American EST and EDT timezones. Supporting timezones at deeper levels of
detail is up to the application. The rules for time adjustment across the
world are more political than rational, change frequently, and there is no
standard suitable for every application aside from UTC.
定数¶
datetime
モジュールでは以下の定数を公開しています:
- datetime.UTC¶
Alias for the UTC timezone singleton
datetime.timezone.utc
.バージョン 3.11 で追加.
利用可能なデータ型¶
- class datetime.date
理想的な naive な日付で、これまでもこれからも現在のグレゴリオ暦 (Gregorian calender) が有効であることを仮定しています。 属性は
year
,month
,およびday
です。
- class datetime.time
理想的な時刻で、特定の日から独立しており、毎日が厳密に 24*60*60 秒であると仮定しています。("うるう秒: leap seconds" の概念はありません。) 属性は
hour
,minute
,second
,microsecond
, およびtzinfo
です。
- class datetime.datetime
日付と時刻を組み合わせたものです。 属性は
year
,month
,day
,hour
,minute
,second
,microsecond
, およびtzinfo
です。
- class datetime.tzinfo
タイムゾーン情報オブジェクトの抽象基底クラスです。
datetime
およびtime
クラスで用いられ、カスタマイズ可能な時刻修正の概念 (たとえばタイムゾーンや夏時間の計算) を提供します。
- class datetime.timezone
tzinfo
抽象基底クラスを UTC からの固定オフセットとして実装するクラスです。バージョン 3.2 で追加.
これらの型のオブジェクトは変更不可能 (immutable) です。
サブクラスの関係は以下のようになります:
object
timedelta
tzinfo
timezone
time
date
datetime
共通の特徴¶
オブジェクトが Aware なのか Naive なのかの判断¶
date
型のオブジェクトは常に naive です。
time
型あるいは datetime
型のオブジェクトは aware か naive のどちらかです。
A datetime
object d is aware if both of the following hold:
d.tzinfo
がNone
でないd.tzinfo.utcoffset(d)
がNone
を返さない
Otherwise, d is naive.
A time
object t is aware if both of the following hold:
t.tzinfo
がNone
でないt.tzinfo.utcoffset(None)
がNone
を返さない
Otherwise, t is naive.
aware なオブジェクトと naive なオブジェクトの区別は timedelta
オブジェクトにはあてはまりません。
timedelta
オブジェクト¶
timedelta
オブジェクトは経過時間、すなわち二つの datetime
または date
のインスタンスの差を表します。
- class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶
All arguments are optional and default to
0
. Arguments may be integers or floats, and may be positive or negative.days, seconds, microseconds だけが内部的に保持されます。 引数は以下のようにして変換されます:
1 ミリ秒は 1000 マイクロ秒に変換されます。
1 分は 60 秒に変換されます。
1 時間は 3600 秒に変換されます。
1 週間は 7 日に変換されます。
さらに、値が一意に表されるように days, seconds, microseconds が以下のように正規化されます
0 <= microseconds < 1000000
0 <= seconds < 3600*24
(一日中の秒数)-999999999 <= days <= 999999999
次の例は、 days, seconds, microseconds に加えて任意の引数がどう "集約" され、最終的に3つの属性に正規化されるかの説明をしています:
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Only days, seconds, and microseconds remain >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)
引数のいずれかが浮動小数点であり、小数のマイクロ秒が存在する場合、小数のマイクロ秒は全ての引数から一度取り置かれ、それらの和は最近接偶数のマイクロ秒に丸められます。浮動小数点の引数がない場合、値の変換と正規化の過程は厳密な (失われる情報がない) ものとなります。
日の値を正規化した結果、指定された範囲の外側になった場合には、
OverflowError
が送出されます。負の値を正規化すると、最初は混乱するような値になります。例えば:
>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
以下にクラス属性を示します:
- timedelta.max¶
最大の値を表す
timedelta
オブジェクトで、timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
です。
Note that, because of normalization, timedelta.max
> -timedelta.min
.
-timedelta.max
is not representable as a timedelta
object.
インスタンスの属性 (読み出しのみ):
Attribute |
Value |
---|---|
|
Between -999999999 and 999999999 inclusive |
|
Between 0 and 86399 inclusive |
|
Between 0 and 999999 inclusive |
サポートされている演算を以下に示します:
演算 |
結果 |
---|---|
|
Sum of t2 and t3. Afterwards t1-t2 == t3 and t1-t3 == t2 are true. (1) |
|
Difference of t2 and t3. Afterwards t1 == t2 - t3 and t2 == t1 + t3 are true. (1)(6) |
|
Delta multiplied by an integer.
Afterwards t1 // i == t2 is true,
provided |
In general, t1 * i == t1 * (i-1) + t1 is true. (1) |
|
|
時間差と浮動小数点の積。結果は最近接偶数への丸めを利用して最も近い timedelta.resolution の倍数に丸められます。 |
|
Division (3) of overall duration t2 by
interval unit t3. Returns a |
|
時間差を浮動小数点や整数で除したもの。結果は最近接偶数への丸めを利用して最も近い timedelta.resolution の倍数に丸められます。 |
|
floor が計算され、余りは (もしあれば) 捨てられます。後者の場合、整数が返されます。(3) |
|
剰余が |
|
Computes the quotient and the remainder:
|
|
同じ値を持つ |
|
equivalent to
|
|
equivalent to +t when |
|
|
|
|
注釈:
この演算は正確ですが、オーバフローするかもしれません。
この演算は正確であり、オーバフローし得ません。
Division by 0 raises
ZeroDivisionError
.-timedelta.max is not representable as a
timedelta
object.timedelta
オブジェクトの文字列表現は内部表現に類似した形に正規化されます。そのため負の timedelta は少し変な結果になります。例えば:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
t3 が
timedelta.max
のときを除けば、式t2 - t3
は常に、式t2 + (-t3)
と同等です。t3 がtimedelta.max
の場合、前者の式は結果の値が出ますが、後者はオーバーフローを起こします。
上に列挙した操作に加え timedelta
オブジェクトは date
および datetime
オブジェクトとの間で加減算をサポートしています (下を参照してください)。
バージョン 3.2 で変更: timedelta
オブジェクトの別の timedelta
オブジェクトによる、切り捨て除算と真の除算、および剰余演算と divmod()
関数がサポートされるようになりました。 timedelta
オブジェクトと float
オブジェクトの真の除算と掛け算がサポートされるようになりました。
timedelta
オブジェクトは等価性と順序の比較をサポートします。
ブール演算コンテキストでは、 timedelta
オブジェクトは timedelta(0)
に等しくない場合かつそのときに限り真となります。
インスタンスメソッド:
- timedelta.total_seconds()¶
この期間に含まれるトータルの秒数を返します。
td / timedelta(seconds=1)
と等価です。 秒以外の期間の単位では、直接に除算する形式 (例えばtd / timedelta(microseconds=1)
) が使われます。非常に長い期間 (多くのプラットフォームでは270年以上) については、このメソッドはマイクロ秒の精度を失うことがあることに注意してください。
バージョン 3.2 で追加.
使用例: timedelta
¶
正規化の追加の例です:
>>> # Components of another_year add up to exactly 365 days
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
timedelta
の計算の例です:
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
date
オブジェクト¶
date
オブジェクトは、両方向に無期限に拡張された現在のグレゴリオ暦という理想化された暦の日付 (年月日) を表します。
1 年 1 月 1 日は日番号 1、1 年 1 月 2 日は日番号 2 と呼ばれ、他も同様です。 [2]
- class datetime.date(year, month, day)¶
全ての引数が必須です。 引数は整数で、次の範囲に収まっていなければなりません:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 指定された月と年における日数
範囲を超えた引数を与えた場合、
ValueError
が送出されます。
他のコンストラクタ、および全てのクラスメソッドを以下に示します:
- classmethod date.today()¶
現在のローカルな日付を返します。
date.fromtimestamp(time.time())
と等価です。
- classmethod date.fromtimestamp(timestamp)¶
time.time()
で返されるような POSIX タイムスタンプに対応するローカルな日付を返します。timestamp がプラットフォームの C 関数
localtime()
がサポートする値の範囲から外れていた場合、OverflowError
を送出するかもしれません。またlocaltime()
呼び出しが失敗した場合にはOSError
を送出するかもしれません。この範囲は通常は 1970 年から 2038 年までに制限されています。タイムスタンプの表記にうるう秒を含める非 POSIX なシステムでは、うるう秒はfromtimestamp()
では無視されます。バージョン 3.3 で変更: timestamp がプラットフォームの C 関数
localtime()
のサポートする値の範囲から外れていた場合、ValueError
ではなくOverflowError
を送出するようになりました。localtime()
の呼び出し失敗でValueError
ではなくOSError
を送出するようになりました。
- classmethod date.fromordinal(ordinal)¶
先発グレゴリオ暦による序数に対応する日付を返します。 1 年 1 月 1 日が序数 1 となります。
ValueError
is raised unless1 <= ordinal <= date.max.toordinal()
. For any date d,date.fromordinal(d.toordinal()) == d
.
- classmethod date.fromisoformat(date_string)¶
以下の例外を除く、有効な ISO 8601 フォーマットで与えられた date_string に対応する
date
を返します :精度の低い日付は現在サポートされていません(
YYYY-MM
,YYYY
)。拡張された日付表現は現在サポートされていません(
±YYYYYY-MM-DD
)。序数の日付は現在サポートされていません(
YYYY-OOO
)。
例:
>>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)
バージョン 3.7 で追加.
バージョン 3.11 で変更: 以前はこのメソッドは
YYYY-MM-DD
フォーマットのみをサポートしていました。
- classmethod date.fromisocalendar(year, week, day)¶
年月日で指定された ISO 暦の日付に対応する
date
を返します。 この関数はdate.isocalendar()
関数の逆関数です。バージョン 3.8 で追加.
以下にクラス属性を示します:
- date.min¶
表現できる最も古い日付で、
date(MINYEAR, 1, 1)
です。
- date.max¶
表現できる最も新しい日付で、
date(MAXYEAR, 12, 31)
です。
- date.resolution¶
等しくない日付オブジェクト間の最小の差で、
timedelta(days=1)
です。
インスタンスの属性 (読み出しのみ):
- date.month¶
両端値を含む 1 から 12 までの値です。
- date.day¶
1 から与えられた月と年における日数までの値です。
サポートされている演算を以下に示します:
演算 |
結果 |
---|---|
|
date2 will be |
|
Computes date2 such that |
|
(3) |
date1 == date2 date1 != date2 |
等価性の比較。(4) |
date1 < date2 date1 > date2 date1 <= date2 date1 >= date2 |
順序の比較。(5) |
注釈:
date2 は、
timedelta.days > 0
の場合は進む方向に、timedelta.days < 0
の場合は戻る方向に移動します。 演算後はdate2 - date1 == timedelta.days
が成立します。timedelta.seconds
およびtimedelta.microseconds
は無視されます。date2.year
がMINYEAR
になってしまったり、MAXYEAR
より大きくなってしまう場合にはOverflowError
が送出されます。timedelta.seconds
とtimedelta.microseconds
は無視されます。This is exact, and cannot overflow. timedelta.seconds and timedelta.microseconds are 0, and date2 + timedelta == date1 after.
同じ日を表す
date
オブジェクトは等しいです。date1 is considered less than date2 when date1 precedes date2 in time. In other words,
date1 < date2
if and only ifdate1.toordinal() < date2.toordinal()
.
ブール演算コンテキストでは、全ての time
オブジェクトは真とみなされます。
インスタンスメソッド:
- date.replace(year=self.year, month=self.month, day=self.day)¶
キーワード引数で指定されたパラメータが置き換えられることを除き、同じ値を持つ
date
オブジェクトを返します。以下はプログラム例です:
>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
- date.timetuple()¶
time.localtime()
が返すようなtime.struct_time
を返します。時分秒が 0 で、 DST フラグが -1 です。
d.timetuple()
は次の式と等価です: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 with1
for January 1st.
- date.toordinal()¶
Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 has ordinal 1. For any
date
object d,date.fromordinal(d.toordinal()) == d
.
- date.weekday()¶
月曜日を 0、日曜日を 6 として、曜日を整数で返します。例えば、
date(2002, 12, 4).weekday() == 2
であり、水曜日を示します。isoweekday()
も参照してください。
- date.isoweekday()¶
月曜日を 1,日曜日を 7 として、曜日を整数で返します。例えば、
date(2002, 12, 4).isoweekday() == 3
であり、水曜日を示します。weekday()
,isocalendar()
も参照してください。
- date.isocalendar()¶
year
、week
、weekday
の3つで構成された named tuple を返します。ISO 暦はグレゴリオ暦の変種として広く用いられています。 [3]
ISO 年は完全な週が 52 週または 53 週あり、週は月曜から始まって日曜に終わります。ISO 年でのある年における最初の週は、その年の木曜日を含む最初の (グレゴリオ暦での) 週となります。この週は週番号 1 と呼ばれ、この木曜日での ISO 年はグレゴリオ暦における年と等しくなります。
例えば、2004 年は木曜日から始まるため、ISO 年の最初の週は 2003 年 12 月 29 日、月曜日から始まり、2004 年 1 月 4 日、日曜日に終わります
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
バージョン 3.9 で変更: 結果が タプル から named tuple へ変更されました。
- date.isoformat()¶
日付を ISO 8601 書式の
YYYY-MM-DD
で表した文字列を返します:>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
- date.__str__()¶
For a date d,
str(d)
is equivalent tod.isoformat()
.
- date.ctime()¶
日付を表す文字列を返します:
>>> from datetime import date >>> date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'
d.ctime()
は次の式と等価です:time.ctime(time.mktime(d.timetuple()))
これが等価になるのは、 (
time.ctime()
に呼び出され、date.ctime()
に呼び出されない) ネイティブの C 関数ctime()
が C 標準に準拠しているプラットフォーム上でです。
- date.strftime(format)¶
明示的な書式文字列で制御された、日付を表現する文字列を返します。 時間、分、秒を表す書式コードは値 0 になります。 strftime() と strptime() の振る舞い および
date.isoformat()
も参照してください。
- date.__format__(format)¶
date.strftime()
と等価です。 これにより、 フォーマット済み文字列リテラル の中やstr.format()
を使っているときにdate
オブジェクトの書式文字列を指定できます。 strftime() と strptime() の振る舞い およびdate.isoformat()
も参照してください。
使用例: date
¶
イベントまでの日数を数える例を示します:
>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
... my_birthday = my_birthday.replace(year=today.year + 1)
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
さらなる date
を使う例:
>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'
>>> # Methods for to extracting 'components' under different calendars
>>> 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 )
>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
datetime
オブジェクト¶
datetime
オブジェクトは date
オブジェクトおよび time
オブジェクトの全ての情報が入っている単一のオブジェクトです。
date
オブジェクトと同様に、 datetime
は現在のグレゴリオ暦が両方向に延長されているものと仮定します。また、 time
オブジェクトと同様に、 datetime
は毎日が厳密に 3600*24 秒であると仮定します。
以下にコンストラクタを示します:
- class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
year, month, day 引数は必須です。 tzinfo は
None
またはtzinfo
サブクラスのインスタンスです。 残りの引数は次の範囲の整数でなければなりません:MINYEAR <= year <= MAXYEAR
,1 <= month <= 12
,1 <= day <= 指定された月と年における日数
,0 <= hour < 24
,0 <= minute < 60
,0 <= second < 60
,0 <= microsecond < 1000000
,fold in [0, 1]
.
範囲を超えた引数を与えた場合、
ValueError
が送出されます。バージョン 3.6 で変更: fold パラメータが追加されました。
他のコンストラクタ、および全てのクラスメソッドを以下に示します:
- classmethod datetime.today()¶
Return the current local datetime, with
tzinfo
None
.次と等価です:
datetime.fromtimestamp(time.time())
now()
,fromtimestamp()
も参照してください。このメソッドの機能は
now()
と等価ですが、tz
引数はありません。
- classmethod datetime.now(tz=None)¶
現在のローカルな日時を返します。
オプションの引数 tz が
None
であるか指定されていない場合、このメソッドはtoday()
と同様ですが、可能ならばtime.time()
タイムスタンプを通じて得ることができる、より高い精度で時刻を提供します (例えば、プラットフォームが C 関数gettimeofday()
をサポートする場合には可能なことがあります)。tz が
None
でない場合、 tz はtzinfo
のサブクラスのインスタンスでなければならず、現在の日付および時刻は tz のタイムゾーンに変換されます。
- classmethod datetime.utcnow()¶
tzinfo
がNone
である現在の UTC の日付および時刻を返します。このメソッドは
now()
と似ていますが、 naive なdatetime
オブジェクトとして現在の UTC 日付および時刻を返します。 aware な現在の UTC datetime はdatetime.now(timezone.utc)
を呼び出すことで取得できます。now()
も参照してください。警告
naive な
datetime
オブジェクトは多くのdatetime
メソッドでローカルな時間として扱われるため、 aware な datetime を使って UTC の時刻を表すのが好ましいです。 そのため、 UTC での現在の時刻を表すオブジェクトの作成ではdatetime.now(timezone.utc)
を呼び出す方法が推奨されます。
- classmethod datetime.fromtimestamp(timestamp, tz=None)¶
time.time()
が返すような、 POSIX タイムスタンプに対応するローカルな日付と時刻を返します。オプションの引数 tz がNone
であるか、指定されていない場合、タイムスタンプはプラットフォームのローカルな日付および時刻に変換され、返されるdatetime
オブジェクトは naive なものになります。tz が
None
でない場合、 tz はtzinfo
のサブクラスのインスタンスでなければならず、タイムスタンプは tz のタイムゾーンに変換されます。タイムスタンプがプラットフォームの C 関数
localtime()
やgmtime()
でサポートされている範囲を超えた場合、fromtimestamp()
はOverflowError
を送出することがあります。この範囲はよく 1970 年から 2038 年に制限されています。 またlocaltime()
やgmtime()
が失敗した際はOSError
を送出します。 うるう秒がタイムスタンプの概念に含まれている非 POSIX システムでは、fromtimestamp()
はうるう秒を無視します。 このため、秒の異なる二つのタイムスタンプが同一のdatetime
オブジェクトとなることが起こり得ます。utcfromtimestamp()
よりも、このメソッドの方が好ましいです。バージョン 3.3 で変更: timestamp がプラットフォームの C 関数
localtime()
もしくはgmtime()
のサポートする値の範囲から外れていた場合、ValueError
ではなくOverflowError
を送出するようになりました。localtime()
もしくはgmtime()
の呼び出し失敗でValueError
ではなくOSError
を送出するようになりました。バージョン 3.6 で変更:
fromtimestamp()
はfold
を1にしてインスタンスを返します。
- classmethod datetime.utcfromtimestamp(timestamp)¶
POSIX タイムスタンプに対応する、
tzinfo
がNone
の UTC でのdatetime
を返します。(返されるオブジェクトは naive です。)タイムスタンプがプラットフォームにおける C 関数
localtime()
でサポートされている範囲を超えている場合にはOverflowError
を、gmtime()
が失敗した場合にはOSError
を送出します。 これはたいてい 1970 年から 2038 年に制限されています。aware な
datetime
オブジェクトを得るにはfromtimestamp()
を呼んでください:datetime.fromtimestamp(timestamp, timezone.utc)
POSIX 互換プラットフォームでは、これは以下の表現と等価です:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
後者を除き、式は常に年の全範囲 (
MINYEAR
からMAXYEAR
を含みます) をサポートします。警告
naive な
datetime
オブジェクトは多くのdatetime
メソッドでローカルな時間として扱われるため、 aware な datetime を使って UTC の時刻を表すのが好ましいです。 そのため、 UTC でのある特定のタイムスタンプを表すオブジェクトの作成ではdatetime.fromtimestamp(timestamp, tz=timezone.utc)
を呼び出す方法が推奨されます。バージョン 3.3 で変更: timestamp がプラットフォームの C 関数
gmtime()
のサポートする値の範囲から外れていた場合、ValueError
ではなくOverflowError
を送出するようになりました。gmtime()
の呼び出し失敗でValueError
ではなくOSError
を送出するようになりました。
- classmethod datetime.fromordinal(ordinal)¶
1 年 1 月 1 日を序数 1 とする早期グレゴリオ暦序数に対応する
datetime
オブジェクトを返します。1 <= ordinal <= datetime.max.toordinal()
でなければValueError
が送出されます。 返されるオブジェクトの時間、分、秒、およびマイクロ秒はすべて 0 で、tzinfo
はNone
となっています。
- classmethod datetime.combine(date, time, tzinfo=self.tzinfo)¶
Return a new
datetime
object whose date components are equal to the givendate
object's, and whose time components are equal to the giventime
object's. If the tzinfo argument is provided, its value is used to set thetzinfo
attribute of the result, otherwise thetzinfo
attribute of the time argument is used.For any
datetime
object d,d == datetime.combine(d.date(), d.time(), d.tzinfo)
. If date is adatetime
object, its time components andtzinfo
attributes are ignored.バージョン 3.6 で変更: tzinfo 引数が追加されました。
- classmethod datetime.fromisoformat(date_string)¶
以下の例外を除く、有効な ISO 8601 フォーマットで与えられた date_string に対応する
datetime
を返します :小数の秒があるタイムゾーンオフセット。
T
セパレーターを他の1文字のユニコードに置き換えたもの。少数の時と分はサポートされていません。
精度の低い日付は現在サポートされていません(
YYYY-MM
,YYYY
)。拡張された日付表現は現在サポートされていません(
±YYYYYY-MM-DD
)。序数の日付は現在サポートされていません(
YYYY-OOO
)。
例:
>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('20111104') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-11-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
バージョン 3.7 で追加.
バージョン 3.11 で変更: Previously, this method only supported formats that could be emitted by
date.isoformat()
ordatetime.isoformat()
.
- classmethod datetime.fromisocalendar(year, week, day)¶
年月日で指定された ISO 暦の日付に対応する
datetime
を返します。 datetime の日付でない部分は、標準のデフォルト値で埋められます。 この関数はdatetime.isocalendar()
の逆関数です。バージョン 3.8 で追加.
- classmethod datetime.strptime(date_string, format)¶
date_string に対応した
datetime
を返します。 format にしたがって構文解析されます。If format does not contain microseconds or timezone information, this is equivalent to:
datetime(*(time.strptime(date_string, format)[0:6]))
date_string と format が
time.strptime()
で構文解析できない場合や、この関数が時刻タプルを返してこない場合にはValueError
を送出します。strftime() と strptime() の振る舞い およびdatetime.fromisoformat()
も参照してください。
以下にクラス属性を示します:
インスタンスの属性 (読み出しのみ):
- datetime.month¶
両端値を含む 1 から 12 までの値です。
- datetime.day¶
1 から与えられた月と年における日数までの値です。
- datetime.hour¶
in
range(24)
を満たします。
- datetime.minute¶
in
range(60)
を満たします。
- datetime.second¶
in
range(60)
を満たします。
- datetime.microsecond¶
in
range(1000000)
を満たします。
- datetime.fold¶
In
[0, 1]
. Used to disambiguate wall times during a repeated interval. (A repeated interval occurs when clocks are rolled back at the end of daylight saving time or when the UTC offset for the current zone is decreased for political reasons.) The value 0 (1) represents the earlier (later) of the two moments with the same wall time representation.バージョン 3.6 で追加.
サポートされている演算を以下に示します:
演算 |
結果 |
---|---|
|
(1) |
|
(2) |
|
(3) |
datetime1 == datetime2 datetime1 != datetime2 |
等価性の比較。(4) |
datetime1 < datetime2 datetime1 > datetime2 datetime1 <= datetime2 datetime1 >= datetime2 |
順序の比較。(5) |
datetime2 is a duration of timedelta removed from datetime1, moving forward in time if
timedelta.days
> 0, or backward iftimedelta.days
< 0. The result has the sametzinfo
attribute as the input datetime, and datetime2 - datetime1 == timedelta after.OverflowError
is raised if datetime2.year would be smaller thanMINYEAR
or larger thanMAXYEAR
. Note that no time zone adjustments are done even if the input is an aware object.Computes the datetime2 such that datetime2 + timedelta == datetime1. As for addition, the result has the same
tzinfo
attribute as the input datetime, and no time zone adjustments are done even if the input is aware.datetime
からdatetime
の減算は両方の被演算子が naive であるか、両方とも aware である場合にのみ定義されています。片方が aware でもう一方が naive の場合、TypeError
が送出されます。If both are naive, or both are aware and have the same
tzinfo
attribute, thetzinfo
attributes are ignored, and the result is atimedelta
object t such thatdatetime2 + t == datetime1
. No time zone adjustments are done in this case.If both are aware and have different
tzinfo
attributes,a-b
acts as if a and b were first converted to naive UTC datetimes. The result is(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())
except that the implementation never overflows.datetime
オブジェクトはタイムゾーンを考慮して同じ日付と時刻を表す場合、等しいです。Naive and aware
datetime
objects are never equal.datetime
objects are never equal todate
objects that are not alsodatetime
instances, even if they represent the same date.If both comparands are aware, and have the same
tzinfo
attribute, thetzinfo
andfold
attributes are ignored and the base datetimes are compared. If both comparands are aware and have differenttzinfo
attributes, the comparison acts as comparands were first converted to UTC datetimes except that the implementation never overflows.datetime
instances in a repeated interval are never equal todatetime
instances in other time zone.タイムゾーンを考慮して、datetime1 が時刻として datetime2 よりも前を表す場合に、datetime1 は datetime2 よりも小さいと見なされます。
Order comparison between naive and aware
datetime
objects, as well as adatetime
object and adate
object that is not also adatetime
instance, raisesTypeError
.If both comparands are aware, and have the same
tzinfo
attribute, thetzinfo
andfold
attributes are ignored and the base datetimes are compared. If both comparands are aware and have differenttzinfo
attributes, the comparison acts as comparands were first converted to UTC datetimes except that the implementation never overflows.
インスタンスメソッド:
- datetime.time()¶
同じhour、minute、second、microsecond 及び foldを持つ
time
オブジェクトを返します。tzinfo
はNone
です。timetz()
も参照してください。バージョン 3.6 で変更: 値 foldは返される
time
オブジェクトにコピーされます。
- datetime.timetz()¶
同じhour、minute、second、microsecond、fold および tzinfo 属性を持つ
time
オブジェクトを返します。time()
メソッドも参照してください。バージョン 3.6 で変更: 値 foldは返される
time
オブジェクトにコピーされます。
- datetime.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)¶
キーワード引数で指定した属性の値を除き、同じ属性をもつ datetime オブジェクトを返します。メンバに対する変換を行わずに aware な datetime オブジェクトから naive な datetime オブジェクトを生成するために、
tzinfo=None
を指定することもできます。バージョン 3.6 で変更: fold パラメータが追加されました。
- datetime.astimezone(tz=None)¶
tz を新たに
tzinfo
属性 として持つdatetime
オブジェクトを返します。 日付および時刻データを調整して、返り値が self と同じ UTC 時刻を持ち、 tz におけるローカルな時刻を表すようにします。If provided, tz must be an instance of a
tzinfo
subclass, and itsutcoffset()
anddst()
methods must not returnNone
. If self is naive, it is presumed to represent time in the system timezone.If called without arguments (or with
tz=None
) the system local timezone is assumed for the target timezone. The.tzinfo
attribute of the converted datetime instance will be set to an instance oftimezone
with the zone name and offset obtained from the OS.If
self.tzinfo
is tz,self.astimezone(tz)
is equal to self: no adjustment of date or time data is performed. Else the result is local time in the timezone tz, representing the same UTC time as self: afterastz = dt.astimezone(tz)
,astz - astz.utcoffset()
will have the same date and time data asdt - dt.utcoffset()
.If you merely want to attach a time zone object tz to a datetime dt without adjustment of date and time data, use
dt.replace(tzinfo=tz)
. If you merely want to remove the time zone object from an aware datetime dt without conversion of date and time data, usedt.replace(tzinfo=None)
.デフォルトの
tzinfo.fromutc()
メソッドをtzinfo
のサブクラスで上書きして,astimezone()
が返す結果に影響を及ぼすことができます。エラーの場合を無視すると、astimezone()
は以下のように動作します:def astimezone(self, tz): if self.tzinfo is tz: return self # Convert self to UTC, and attach the new time zone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc)
バージョン 3.3 で変更: tz が省略可能になりました。
バージョン 3.6 で変更:
datetime.datetime.astimezone()
メソッドを naive なインスタンスに対して呼び出せるようになりました。これは、システムのローカルな時間を表現していると想定されます。
- datetime.utcoffset()¶
tzinfo
がNone
の場合、None
を返し、そうでない場合にはself.tzinfo.utcoffset(self)
を返します。 後者の式がNone
あるいは 1 日以下の大きさを持つtimedelta
オブジェクトのいずれかを返さない場合には例外を送出します。バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
- datetime.dst()¶
tzinfo
がNone
の場合None
を返し、そうでない場合にはself.tzinfo.dst(self)
を返します。 後者の式がNone
もしくは、1 日未満の大きさを持つtimedelta
オブジェクトのいずれかを返さない場合には例外を送出します。バージョン 3.7 で変更: DST オフセットが分単位でなければならない制限が無くなりました。
- datetime.tzname()¶
tzinfo
がNone
の場合None
を返し、そうでない場合にはself.tzinfo.tzname(self)
を返します。 後者の式がNone
か文字列オブジェクトのいずれかを返さない場合には例外を送出します。
- datetime.timetuple()¶
time.localtime()
が返すようなtime.struct_time
を返します。d.timetuple()
は次の式と等価です:time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))
where
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1
is the day number within the current year starting with1
for January 1st. Thetm_isdst
flag of the result is set according to thedst()
method:tzinfo
isNone
ordst()
returnsNone
,tm_isdst
is set to-1
; else ifdst()
returns a non-zero value,tm_isdst
is set to1
; elsetm_isdst
is set to0
.
- datetime.utctimetuple()¶
If
datetime
instance d is naive, this is the same asd.timetuple()
except thattm_isdst
is forced to 0 regardless of whatd.dst()
returns. DST is never in effect for a UTC time.If d is aware, d is normalized to UTC time, by subtracting
d.utcoffset()
, and atime.struct_time
for the normalized time is returned.tm_isdst
is forced to 0. Note that anOverflowError
may be raised if d.year wasMINYEAR
orMAXYEAR
and UTC adjustment spills over a year boundary.警告
naive な
datetime
オブジェクトは多くのdatetime
メソッドでローカルな時間として扱われるため、 aware な datetime を使って UTC の時刻を表すのが好ましいです。結果として、datetime.utctimetuple()
は誤解を招きやすい返り値を返すかもしれません。 UTC を表す naive なdatetime
があった場合、datetime.timetuple()
が使えるところではdatetime.replace(tzinfo=timezone.utc)
で aware にします。
- datetime.toordinal()¶
先発グレゴリオ暦における日付序数を返します。
self.date().toordinal()
と同じです。
- datetime.timestamp()¶
datetime
インスタンスに対応する POSIX タイムスタンプを返します。 返り値はtime.time()
で返される値に近いfloat
です。Naive
datetime
instances are assumed to represent local time and this method relies on the platform Cmktime()
function to perform the conversion. Sincedatetime
supports wider range of values thanmktime()
on many platforms, this method may raiseOverflowError
for times far in the past or far in the future.aware な
datetime
インスタンスに対しては以下のように返り値が計算されます:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
バージョン 3.3 で追加.
バージョン 3.6 で変更: The
timestamp()
method uses thefold
attribute to disambiguate the times during a repeated interval.注釈
There is no method to obtain the POSIX timestamp directly from a naive
datetime
instance representing UTC time. If your application uses this convention and your system timezone is not set to UTC, you can obtain the POSIX timestamp by supplyingtzinfo=timezone.utc
:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
もしくは直接タイムスタンプを計算することもできます:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
- datetime.weekday()¶
月曜日を 0、日曜日を 6 として、曜日を整数で返します。
self.date().weekday()
と同じです。isoweekday()
も参照してください。
- datetime.isoweekday()¶
月曜日を 1、日曜日を 7 として、曜日を整数で返します。
self.date().isoweekday()
と等価です。weekday()
、isocalendar()
も参照してください。
- datetime.isocalendar()¶
year
、week
、weekday
の3つで構成された named tuple を返します。self.date().isocalendar()
と等価です。
- datetime.isoformat(sep='T', timespec='auto')¶
日時を ISO 8601 書式で表した文字列で返します:
microsecond
が 0 でない場合はYYYY-MM-DDTHH:MM:SS.ffffff
microsecond
が 0 の場合はYYYY-MM-DDTHH:MM:SS
utcoffset()
がNone
を返さない場合は、文字列の後ろに UTC オフセットが追記されます:microsecond
が 0 でない場合はYYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]
microsecond
が 0 の場合はYYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]
例:
>>> from datetime import datetime, timezone >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
オプションの引数 sep (デフォルトでは
'T'
です) は 1 文字のセパレータで、結果の文字列の日付と時刻の間に置かれます。例えば:>>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, dt): ... return timedelta(hours=-6, minutes=-39) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'
オプション引数 timespec は、含める追加の時間の要素の数を指定します(デフォルトでは
'auto'
です)。以下の内一つを指定してください。'auto'
:microsecond
が0である場合'seconds'
と等しく、そうでない場合は'microseconds'
と等しくなります。'hours'
:hour
を2桁のHH
書式で含めます。'milliseconds'
: 全ての時刻を含みますが、小数第二位をミリ秒に切り捨てます。HH:MM:SS.sss
の書式で表現します。'microseconds'
: 全ての時刻をHH:MM:SS.mmmmmm
の書式で含めます。
注釈
除外された要素は丸め込みではなく、切り捨てされます。
不正な timespec 引数には
ValueError
があげられます:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
バージョン 3.6 で変更: timespec パラメータを追加しました.
- datetime.ctime()¶
日付および時刻を表す文字列を返します:
>>> from datetime import datetime >>> datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
出力文字列は入力が aware であれ naive であれ、タイムゾーン情報を含み ません。
d.ctime()
は次の式と等価です:time.ctime(time.mktime(d.timetuple()))
これが等価になるのは、 (
time.ctime()
に呼び出され、datetime.ctime()
に呼び出されない) ネイティブの C 関数ctime()
が C 標準に準拠しているプラットフォーム上でです。
- datetime.strftime(format)¶
明示的な書式文字列で制御された、日付および時刻を表現する文字列を返します。strftime() と strptime() の振る舞い および
datetime.isoformat()
も参照してください。
- datetime.__format__(format)¶
datetime.strftime()
と等価です。 これにより、 フォーマット済み文字列リテラル の中やstr.format()
を使っているときにdatetime
オブジェクトの書式文字列を指定できます。 strftime() と strptime() の振る舞い およびdatetime.isoformat()
も参照してください。
使用例: datetime
¶
datetime
オブジェクトを使う例:
>>> from datetime import datetime, date, time, timezone
>>> # 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()
>>> datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> datetime.now(timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # 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 a 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.'
下にある例では、1945年までは +4 UTC 、それ以降は +4:30 UTC を使用しているアフガニスタンのカブールのタイムゾーン情報を表現する tzinfo
のサブクラスを定義しています:
from datetime import timedelta, datetime, tzinfo, timezone
class KabulTz(tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)
def utcoffset(self, dt):
if dt.year < 1945:
return timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):
# An ambiguous ("imaginary") half-hour range representing
# a 'fold' in time due to the shift from +4 to +4:30.
# If dt falls in the imaginary range, use fold to decide how
# to resolve. See PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)
def fromutc(self, dt):
# Follow same validations as in datetime.tzinfo
if not isinstance(dt, datetime):
raise TypeError("fromutc() requires a datetime argument")
if dt.tzinfo is not self:
raise ValueError("dt.tzinfo is not self")
# A custom implementation is required for fromutc as
# the input to this function is a datetime with utc values
# but with a tzinfo set to self.
# See datetime.astimezone or fromtimestamp.
if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
return dt + timedelta(hours=4, minutes=30)
else:
return dt + timedelta(hours=4)
def dst(self, dt):
# Kabul does not observe daylight saving time.
return timedelta(0)
def tzname(self, dt):
if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
上に出てきた KabulTz
の使い方:
>>> tz1 = KabulTz()
>>> # Datetime before the change
>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00
>>> # Datetime after the change
>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00
>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True
time
オブジェクト¶
time
オブジェクトは (ローカルの) 日中時刻を表現します。
この時刻表現は特定の日の影響を受けず、 tzinfo
オブジェクトを介した修正の対象となります。
- class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
全ての引数はオプションです。 tzinfo は
None
またはtzinfo
クラスのサブクラスのインスタンスにすることができます。残りの引数は整数で、以下のような範囲に入らなければなりません:0 <= hour < 24
,0 <= minute < 60
,0 <= second < 60
,0 <= microsecond < 1000000
,fold in [0, 1]
.
If an argument outside those ranges is given,
ValueError
is raised. All default to0
except tzinfo, which defaults toNone
.
以下にクラス属性を示します:
- time.resolution¶
等しくない
time
オブジェクト間の最小の差で、timedelta(microseconds=1)
ですが,time
オブジェクト間の四則演算はサポートされていないので注意してください。
インスタンスの属性 (読み出しのみ):
- time.hour¶
in
range(24)
を満たします。
- time.minute¶
in
range(60)
を満たします。
- time.second¶
in
range(60)
を満たします。
- time.microsecond¶
in
range(1000000)
を満たします。
- time.fold¶
In
[0, 1]
. Used to disambiguate wall times during a repeated interval. (A repeated interval occurs when clocks are rolled back at the end of daylight saving time or when the UTC offset for the current zone is decreased for political reasons.) The value 0 (1) represents the earlier (later) of the two moments with the same wall time representation.バージョン 3.6 で追加.
time
objects support equality and order comparisons,
where a is considered less than b when a precedes b in time.
Naive and aware time
objects are never equal.
Order comparison between naive and aware time
objects raises
TypeError
.
比較対象が両方とも aware であり、同じ tzinfo
属性を持つ場合、 tzinfo
と fold
属性は無視され時間だけで比較が行われます。比較対象が両方とも aware であり、異なる tzinfo
属性を持つ場合、まず最初に (self.utcoffset()
で取得できる) それぞれの UTC オフセットを引く調整が行われます。
ブール値の文脈では、 time
オブジェクトは常に真とみなされます。
バージョン 3.5 で変更: Python 3.5 以前は、 time
オブジェクトは UTC で深夜を表すときに偽とみなされていました。
この挙動は分かりにくく、エラーの元となると考えられ、Python 3.5 で削除されました。
全詳細については bpo-13936 を参照してください。
その他のコンストラクタ:
- classmethod time.fromisoformat(time_string)¶
以下の例外を除く、有効な ISO 8601 フォーマットで与えられた time_string に対応する
time
を返します :小数の秒があるタイムゾーンオフセット。
The leading
T
, normally required in cases where there may be ambiguity between a date and a time, is not required.Fractional seconds may have any number of digits (anything beyond 6 will be truncated).
少数の時と分はサポートされていません。
例:
>>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) >>> time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
バージョン 3.7 で追加.
バージョン 3.11 で変更: Previously, this method only supported formats that could be emitted by
time.isoformat()
.
インスタンスメソッド:
- time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
キーワード引数で指定したメンバの値を除き、同じ値をもつ
time
オブジェクトを返します。データに対する変換を行わずに aware なtime
オブジェクトから naive なtime
オブジェクトを生成するために、tzinfo=None
を指定することもできます。バージョン 3.6 で変更: fold パラメータが追加されました。
- time.isoformat(timespec='auto')¶
時刻を ISO 8601 書式で表した次の文字列のうち1つを返します:
microsecond
が 0 でない場合はHH:MM:SS.ffffff
microsecond
が 0 の場合はHH:MM:SS
utcoffset()
がNone
を返さない場合、HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]
microsecond
が 0 でutcoffset()
がNone
を返さない場合、HH:MM:SS+HH:MM[:SS[.ffffff]]
オプション引数 timespec は、含める追加の時間の要素の数を指定します(デフォルトでは
'auto'
です)。以下の内一つを指定してください。'auto'
:microsecond
が0である場合'seconds'
と等しく、そうでない場合は'microseconds'
と等しくなります。'hours'
:hour
を2桁のHH
書式で含めます。'milliseconds'
: 全ての時刻を含みますが、小数第二位をミリ秒に切り捨てます。HH:MM:SS.sss
の書式で表現します。'microseconds'
: 全ての時刻をHH:MM:SS.mmmmmm
の書式で含めます。
注釈
除外された要素は丸め込みではなく、切り捨てされます。
不正な timespec 引数には
ValueError
があげられます。以下はプログラム例です:
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
バージョン 3.6 で変更: timespec パラメータを追加しました.
- time.__str__()¶
For a time t,
str(t)
is equivalent tot.isoformat()
.
- time.strftime(format)¶
明示的な書式文字列で制御された、時刻を表現する文字列を返します。strftime() と strptime() の振る舞い および
time.isoformat()
も参照してください。
- time.__format__(format)¶
time.strftime()
と等価です。 これにより、 フォーマット済み文字列リテラル の中やstr.format()
を使っているときにtime
オブジェクトの書式文字列を指定できます。 strftime() と strptime() の振る舞い およびtime.isoformat()
も参照してください。
- time.utcoffset()¶
tzinfo
がNone
の場合、None
を返し、そうでない場合にはself.tzinfo.utcoffset(None)
を返します。 後者の式がNone
あるいは 1 日以下の大きさを持つtimedelta
オブジェクトのいずれかを返さない場合には例外を送出します。バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
- time.dst()¶
tzinfo
がNone
の場合None
を返し、そうでない場合にはself.tzinfo.dst(None)
を返します。 後者の式がNone
もしくは、1 日未満の大きさを持つtimedelta
オブジェクトのいずれかを返さない場合には例外を送出します。バージョン 3.7 で変更: DST オフセットが分単位でなければならない制限が無くなりました。
- time.tzname()¶
tzinfo
がNone
の場合None
を返し、そうでない場合にはself.tzinfo.tzname(None)
を返します。 後者の式がNone
か文字列オブジェクトのいずれかを返さない場合には例外を送出します。
使用例: time
¶
time
オブジェクトを使う例:
>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self,dt):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
tzinfo
オブジェクト¶
- class datetime.tzinfo¶
このクラスは抽象基底クラスで、直接インスタンス化すべきでないことを意味します。
tzinfo
のサブクラスを定義し、ある特定のタイムゾーンに関する情報を保持するようにしてください。tzinfo
(の具体的なサブクラス) のインスタンスはdatetime
およびtime
オブジェクトのコンストラクタに渡すことができます。後者のオブジェクトでは、データ属性をローカル時刻におけるものとして見ており、tzinfo
オブジェクトはローカル時刻の UTC からのオフセット、タイムゾーンの名前、 DST オフセットを、渡された日付および時刻オブジェクトからの相対で示すためのメソッドを提供します。You need to derive a concrete subclass, and (at least) supply implementations of the standard
tzinfo
methods needed by thedatetime
methods you use. Thedatetime
module providestimezone
, a simple concrete subclass oftzinfo
which can represent timezones with fixed offset from UTC such as UTC itself or North American EST and EDT.pickle 化についての特殊な要求事項:
tzinfo
のサブクラスは引数なしで呼び出すことのできる__init__()
メソッドを持たなければなりません。そうでなければ、 pickle 化することはできますがおそらく unpickle 化することはできないでしょう。これは技術的な側面からの要求であり、将来緩和されるかもしれません。tzinfo
の具体的なサブクラスでは、以下のメソッドを実装する必要があります。厳密にどのメソッドが必要なのかは、 aware なdatetime
オブジェクトがこのサブクラスのインスタンスをどのように使うかに依存します。不確かならば、単に全てを実装してください。
- tzinfo.utcoffset(dt)¶
ローカル時間の UTC からのオフセットを、 UTC から東向きを正とした
timedelta
オブジェクトで返します。ローカル時間が UTC の西側にある場合、この値は負になります。このメソッドは UTC からのオフセットの 総計 を表しています。例えば、
tzinfo
オブジェクトがタイムゾーンと DST 修正の両方を表現する場合、utcoffset()
はそれらの合計を返さなければなりません。 UTC オフセットが未知である場合、None
を返します。 そうでない場合には、返される値は-timedelta(hours=24)
からtimedelta(hours=24)
までのtimedelta
境界を含まないオブジェクトでなければなりません (オフセットの大きさは 1 日より短くなければなりません)。 ほとんどのutcoffset()
実装は、おそらく以下の二つのうちの一つに似たものになるでしょう:return CONSTANT # fixed-offset class return CONSTANT + self.dst(dt) # daylight-aware class
utcoffset()
がNone
を返さない場合、dst()
もNone
を返してはなりません。utcoffset()
のデフォルトの実装はNotImplementedError
を送出します。バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
- tzinfo.dst(dt)¶
夏時間 (DST) 修正を、
timedelta
オブジェクトで返します。 DST 情報が未知の場合、None
が返されます。DST が有効でない場合には
timedelta(0)
を返します。 DST が有効の場合、オフセットはtimedelta
オブジェクトで返します (詳細はutcoffset()
を参照してください)。 DST オフセットが利用可能な場合、この値はutcoffset()
が返す UTC からのオフセットには既に加算されているため、 DST を個別に取得する必要がない限りdst()
を使って問い合わせる必要はないので注意してください。 例えば、datetime.timetuple()
はtzinfo
属性のdst()
メソッドを呼んでtm_isdst
フラグがセットされているかどうか判断し、tzinfo.fromutc()
はdst()
タイムゾーンを移動する際に DST による変更があるかどうかを調べます。標準および夏時間の両方をモデル化している
tzinfo
サブクラスのインスタンス tz は以下の式:tz.utcoffset(dt) - tz.dst(dt)
must return the same result for every
datetime
dt withdt.tzinfo == tz
For sanetzinfo
subclasses, this expression yields the time zone's "standard offset", which should not depend on the date or the time, but only on geographic location. The implementation ofdatetime.astimezone()
relies on this, but cannot detect violations; it's the programmer's responsibility to ensure it. If atzinfo
subclass cannot guarantee this, it may be able to override the default implementation oftzinfo.fromutc()
to work correctly withastimezone()
regardless.ほとんどの
dst()
実装は、おそらく以下の二つのうちの一つに似たものになるでしょう:def dst(self, dt): # a fixed-offset class: doesn't account for DST return timedelta(0)
もしくは:
def dst(self, dt): # Code to set dston and dstoff to the time zone's DST # transition times based on the input dt.year, and expressed # in standard local time. if dston <= dt.replace(tzinfo=None) < dstoff: return timedelta(hours=1) else: return timedelta(0)
デフォルトの
dst()
実装はNotImplementedError
を送出します。バージョン 3.7 で変更: DST オフセットが分単位でなければならない制限が無くなりました。
- tzinfo.tzname(dt)¶
Return the time zone name corresponding to the
datetime
object dt, as a string. Nothing about string names is defined by thedatetime
module, and there's no requirement that it mean anything in particular. For example, "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all valid replies. ReturnNone
if a string name isn't known. Note that this is a method rather than a fixed string primarily because sometzinfo
subclasses will wish to return different names depending on the specific value of dt passed, especially if thetzinfo
class is accounting for daylight time.デフォルトの
tzname()
実装はNotImplementedError
を送出します。
以下のメソッドは datetime
や time
オブジェクトにおいて、同名のメソッドが呼び出された際に応じて呼び出されます。 datetime
オブジェクトは自身を引数としてメソッドに渡し、 time
オブジェクトは引数として None
をメソッドに渡します。従って、 tzinfo
のサブクラスにおけるメソッドは引数 dt が None
の場合と、 datetime
の場合を受理するように用意しなければなりません。
None
が渡された場合、最良の応答方法を決めるのはクラス設計者次第です。例えば、このクラスが tzinfo
プロトコルと関係をもたないということを表明させたければ、 None
が適切です。標準時のオフセットを見つける他の手段がない場合には、標準 UTC オフセットを返すために utcoffset(None)
を使うともっと便利かもしれません。
When a datetime
object is passed in response to a datetime
method, dt.tzinfo
is the same object as self. tzinfo
methods can
rely on this, unless user code calls tzinfo
methods directly. The
intent is that the tzinfo
methods interpret dt as being in local
time, and not need worry about objects in other timezones.
サブクラスでオーバーライドすると良い、もう 1 つの tzinfo
のメソッドがあります:
- tzinfo.fromutc(dt)¶
This is called from the default
datetime.astimezone()
implementation. When called from that,dt.tzinfo
is self, and dt's date and time data are to be viewed as expressing a UTC time. The purpose offromutc()
is to adjust the date and time data, returning an equivalent datetime in self's local time.ほとんどの
tzinfo
サブクラスではデフォルトのfromutc()
実装を問題なく継承できます。デフォルトの実装は、固定オフセットのタイムゾーンや、標準時と夏時間の両方について記述しているタイムゾーン、そして DST 移行時刻が年によって異なる場合でさえ、扱えるくらい強力なものです。デフォルトのfromutc()
実装が全ての場合に対して正しく扱うことができないような例は、標準時の (UTCからの) オフセットが引数として渡された特定の日や時刻に依存するもので、これは政治的な理由によって起きることがあります。デフォルトのastimezone()
やfromutc()
の実装は、結果が標準時オフセットの変化にまたがる何時間かの中にある場合、期待通りの結果を生成しないかもしれません。エラーの場合のためのコードを除き、デフォルトの
fromutc()
の実装は以下のように動作します:def fromutc(self, dt): # raise ValueError error if dt.tzinfo is not self dtoff = dt.utcoffset() dtdst = dt.dst() # raise ValueError if dtoff is None or dtdst is None delta = dtoff - dtdst # this is self's standard offset if delta: dt += delta # convert to standard local time dtdst = dt.dst() # raise ValueError if dtdst is None if dtdst: return dt + dtdst else: return dt
次の tzinfo_examples.py
ファイルには、 tzinfo
クラスの例がいくつか載っています:
from datetime import tzinfo, timedelta, datetime
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
SECOND = timedelta(seconds=1)
# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
# timezones where UTC offset and/or the DST rules had
# changed in the past.)
import time as _time
STDOFFSET = timedelta(seconds = -_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds = -_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(tzinfo):
def fromutc(self, dt):
assert dt.tzinfo is self
stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = _time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Detect fold
fold = (args == _time.localtime(stamp - dst_diff))
return datetime(*args, microsecond=dt.microsecond,
tzinfo=self, fold=fold)
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
# A complete implementation of current DST rules for major US time zones.
def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt
# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(year):
# Find start and end times for US DST. For years before 1967, return
# start = end for no DST.
if 2006 < year:
dststart, dstend = DSTSTART_2007, DSTEND_2007
elif 1986 < year < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
elif 1966 < year < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
else:
return (datetime(year, 1, 1), ) * 2
start = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
return start, end
class USTimeZone(tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, dt):
if self.dst(dt):
return self.dstname
else:
return self.stdname
def utcoffset(self, dt):
return self.stdoffset + self.dst(dt)
def dst(self, dt):
if dt is None or dt.tzinfo is None:
# An exception may be sensible here, in one or both cases.
# It depends on how you want to treat them. The default
# fromutc() implementation (called by the default astimezone()
# implementation) passes a datetime with dt.tzinfo is self.
return ZERO
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
# Can't compare naive to aware objects, so strip the timezone from
# dt first.
dt = dt.replace(tzinfo=None)
if start + HOUR <= dt < end - HOUR:
# DST is in effect.
return HOUR
if end - HOUR <= dt < end:
# Fold (an ambiguous hour): use dt.fold to disambiguate.
return ZERO if dt.fold else HOUR
if start <= dt < start + HOUR:
# Gap (a non-existent hour): reverse the fold rule.
return HOUR if dt.fold else ZERO
# DST is off.
return ZERO
def fromutc(self, dt):
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = dt + self.stdoffset
dst_time = std_time + HOUR
if end <= dst_time < end + HOUR:
# Repeated hour
return std_time.replace(fold=1)
if std_time < start or dst_time >= end:
# Standard time
return std_time
if start <= std_time < end - HOUR:
# Daylight saving time
return dst_time
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
Central = USTimeZone(-6, "Central", "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
標準時および夏時間の両方を記述している tzinfo
のサブクラスでは、夏時間の移行のときに、回避不能の難解な問題が年に 2 度あるので注意してください。
具体的な例として、東部アメリカ時刻 (US Eastern, UTC -0500) を考えます。
EDT は 3 月の第二日曜日の 1:59 (EST) の 1 分後に開始し、11 月の最初の日曜日の (EDTの) 1:59 に終了します:
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM
EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM
EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM
start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM
end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM
DSTの開始 ("start" ライン) で、ローカルの実時間は 1:59 から 3:00 に飛びます。
この日には、 2:MM という形式の実時間は意味をなさないので、 DST が始まった日に astimezone(Eastern)
は hour == 2
となる結果を返すことはありません。
例として、 2016 年の春方向の移行では、次のような結果になります:
>>> from datetime import datetime, timezone
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT
DST が終了 ("end" ライン) で、更なる問題が潜んでいます: ローカルの実時間で、曖昧さ無しに時を綴れない 1 時間が存在します: それは夏時間の最後の 1 時間です。
東部では、夏時間が終了する日の UTC での 5:MM 形式の時間がそれです。
ローカルの実時間は (夏時間の) 1:59 から (標準時の) 1:00 に再び巻き戻されます。
ローカルの時刻における 1:MM は曖昧です。
そして astimezone()
は 2 つの隣り合う UTC 時間を同じローカルの時間に対応付けて、ローカルの時計の振る舞いを真似ます。
東部の例では、 5:MM および 6:MM という形式の UTC 時刻は両方とも東部時刻に変換された際に 1:MM に対応付けられますが、それ以前の時間は fold
属性を 0 にし、以降の時間では 1 にします。例えば、 2016 年での秋方向の移行では、次のような結果になります:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
fold
属性が異なるだけの datetime
インスタンスは比較において等しいとみなされることに注意してください。
壁時間に関する曖昧さは、明示的に fold
属性を検証するか、 timezone
が使用されたハイブリッドな tzinfo
サブクラスか、そのほかの絶対時間差を示す tzinfo
サブクラス(EST (-5 時間の絶対時間差) のみを表すクラスや、 EDT (-4 時間の絶対時間差) のみを表すクラス)を使用すると回避できます。
このような曖昧さを許容できないアプリケーションは、このような手法によって回避すべきです。
参考
zoneinfo
The
datetime
module has a basictimezone
class (for handling arbitrary fixed offsets from UTC) and itstimezone.utc
attribute (a UTC timezone instance).
zoneinfo
brings the IANA timezone database (also known as the Olson database) to Python, and its usage is recommended.
- IANA timezone database
(しばしば tz、tzdata や zoneinfo と呼ばれる) タイムゾーンデータベースはコードとデータを保持しており、それらは地球全体にわたる多くの代表的な場所のローカル時刻の履歴を表しています。政治団体によるタイムゾーンの境界、UTC オフセット、夏時間のルールの変更を反映するため、定期的にデータベースが更新されます。
timezone
オブジェクト¶
The timezone
class is a subclass of tzinfo
, each
instance of which represents a timezone defined by a fixed offset from
UTC.
Objects of this class cannot be used to represent timezone information in the locations where different offsets are used in different days of the year or where historical changes have been made to civil time.
- class datetime.timezone(offset, name=None)¶
ローカル時刻と UTC の差分を表す
timedelta
オブジェクトを offset 引数に指定しなくてはいけません。これは-timedelta(hours=24)
からtimedelta(hours=24)
までの両端を含まない範囲に収まっていなくてはなりません。そうでない場合ValueError
が送出されます。name 引数は必須ではありません。もし指定された場合、その値は
datetime.tzname()
メソッドの返り値として使われる文字列でなければなりません。バージョン 3.2 で追加.
バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
- timezone.utcoffset(dt)¶
timezone
インスタンスが構築されたときに指定された固定値を返します。dt 引数は無視されます。 返り値は、ローカル時刻と UTC の差分に等しい
timedelta
インスタンスです。バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
- timezone.tzname(dt)¶
timezone
インスタンスが構築されたときに指定された固定値を返します。name が構築時に与えられなかった場合、
tzname(dt)
によって返される name は以下の様にoffset
の値から生成されます。 offset がtimedelta(0)
であった場合、 name は "UTC"になります。 それ以外の場合、 'UTC±HH:MM' という書式の文字列になり、± はoffset
を、HH と MM はそれぞれ二桁のoffset.hours
とoffset.minutes
を表現します。バージョン 3.6 で変更:
offset=timedelta(0)
によって生成される名前はプレーンな 'UTC' であり'UTC+00:00'
ではありません。
- timezone.dst(dt)¶
常に
None
を返します。
- timezone.fromutc(dt)¶
dt + offset
を返します。 dt 引数はtzinfo
がself
になっている aware なdatetime
インスタンスでなければなりません。
以下にクラス属性を示します:
- timezone.utc¶
The UTC timezone,
timezone(timedelta(0))
.
strftime()
と strptime()
の振る舞い¶
date
, datetime
, time
オブジェクトは全て strftime(format)
メソッドをサポートし、時刻を表現する文字列を明示的な書式文字列で統制して作成しています。
逆に datetime.strptime()
クラスメソッドは日付や時刻に対応する書式文字列から datetime
オブジェクトを生成します。
下の表は strftime()
と strptime()
との高レベルの対比を表しています。
|
|
|
---|---|---|
使用法 |
オブジェクトを与えられた書式に従って文字列に変換する |
指定された対応する書式で文字列を構文解析して |
メソッドの種類 |
インスタンスメソッド |
クラスメソッド |
メソッドを持つクラス |
||
シグネチャ |
|
|
strftime()
と strptime()
の書式コード¶
These methods accept format codes that can be used to parse and format dates:
>>> datetime.strptime('31/01/22 23:59:59.999999',
... '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'
以下のリストは 1989 C 標準が要求する全ての書式コードで、標準 C 実装があれば全ての環境で動作します。
ディレクティブ |
意味 |
使用例 |
注釈 |
---|---|---|---|
|
ロケールの曜日名を短縮形で表示します。 |
Sun, Mon, ..., Sat
(en_US);
So, Mo, ..., Sa
(de_DE)
|
(1) |
|
ロケールの曜日名を表示します。 |
Sunday, Monday, ...,
Saturday (en_US);
Sonntag, Montag, ...,
Samstag (de_DE)
|
(1) |
|
曜日を10進表記した文字列を表示します。0 が日曜日で、6 が土曜日を表します。 |
0, 1, ..., 6 |
|
|
0埋めした10進数で表記した月中の日にち。 |
01, 02, ..., 31 |
(9) |
|
ロケールの月名を短縮形で表示します。 |
Jan, Feb, ..., Dec
(en_US);
Jan, Feb, ..., Dez
(de_DE)
|
(1) |
|
ロケールの月名を表示します。 |
January, February,
..., December (en_US);
Januar, Februar, ...,
Dezember (de_DE)
|
(1) |
|
0埋めした10進数で表記した月。 |
01, 02, ..., 12 |
(9) |
|
0埋めした10進数で表記した世紀無しの年。 |
00, 01, ..., 99 |
(9) |
|
西暦 ( 4桁) の 10 進表記を表します。 |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(2) |
|
0埋めした10進数で表記した時 (24時間表記)。 |
00, 01, ..., 23 |
(9) |
|
0埋めした10進数で表記した時 (12時間表記)。 |
01, 02, ..., 12 |
(9) |
|
ロケールの AM もしくは PM と等価な文字列になります。 |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
0埋めした10進数で表記した分。 |
00, 01, ..., 59 |
(9) |
|
0埋めした10進数で表記した秒。 |
00, 01, ..., 59 |
(4), (9) |
|
10進数で表記したマイクロ秒 (6桁に0埋めされます)。 |
000000, 000001, ..., 999999 |
(5) |
|
UTCオフセットを |
(空文字列), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
タイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)。 |
(空文字列), UTC, GMT |
(6) |
|
0埋めした10進数で表記した年中の日にち。 |
001, 002, ..., 366 |
(9) |
|
0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。 |
00, 01, ..., 53 |
(7), (9) |
|
0埋めした10進数で表記した年中の週番号 (週の始まりは月曜日とする)。新年の最初の月曜日に先立つ日は 0週に属するとします。 |
00, 01, ..., 53 |
(7), (9) |
|
ロケールの日時を適切な形式で表します。 |
Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
|
ロケールの日付を適切な形式で表します。 |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
ロケールの時間を適切な形式で表します。 |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
文字 |
% |
C89規格により要求されない幾つかの追加のコードが便宜上含まれています。これらのパラメータはすべてISO 8601の日付値に対応しています。
ディレクティブ |
意味 |
使用例 |
注釈 |
---|---|---|---|
|
ISO week( |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(8) |
|
1 を月曜日を表す 10進数表記の ISO 8601 weekday です。 |
1, 2, ..., 7 |
|
|
週で最初の月曜日を始めとする ISO 8601 week です。Week 01 は 1月4日を含みます。 |
01, 02, ..., 53 |
(8), (9) |
これらが strftime()
メソッドと一緒に使用された場合、すべてのプラットフォームで利用できるわけではありません。 ISO 8601 year 指定子およびISO 8601 week 指定子は、上記のyear および week number 指定子と互換性がありません。不完全またはあいまいなISO 8601 指定子で strptime()
を呼び出すと、 ValueError
が送出されます。
Python はプラットフォームの C ライブラリの strftime()
関数を呼び出していて、プラットフォームごとにその実装が異なるのはよくあることなので、サポートされる書式コード全体はプラットフォームごとに様々です。
手元のプラットフォームでサポートされているフォーマット記号全体を見るには、 strftime(3) のドキュメントを参照してください。
サポートされていないフォーマット指定子の扱いもプラットフォーム間で差異があります。
バージョン 3.6 で追加: %G
, %u
および %V
が追加されました。
技術詳細¶
大雑把にいうと、 d.strftime(fmt)
は time
モジュールの time.strftime(fmt, d.timetuple())
のように動作します。ただし全てのオブジェクトが timetuple()
メソッドをサポートしているわけではありません。
datetime.strptime()
クラスメソッドでは、デフォルト値は 1900-01-01T00:00:00.000
です。書式文字列で指定されなかった部分はデフォルト値から引っ張ってきます。 [4]
datetime.strptime(date_string, format)
は次の式と等価です:
datetime(*(time.strptime(date_string, format)[0:6]))
except when the format includes sub-second components or timezone offset
information, which are supported in datetime.strptime
but are discarded by
time.strptime
.
For time
objects, the format codes for year, month, and day should not
be used, as time
objects have no such values. If they're used anyway,
1900
is substituted for the year, and 1
for the month and day.
For date
objects, the format codes for hours, minutes, seconds, and
microseconds should not be used, as date
objects have no such
values. If they're used anyway, 0
is substituted for them.
同じ理由で、現在のロケールの文字集合で表現できない Unicode コードポイントを含む書式文字列の対処もプラットフォーム依存です。
あるプラットフォームではそういったコードポイントはそのまま出力に出される一方、他のプラットフォームでは strftime
が UnicodeError
を送出したり、その代わりに空文字列を返したりするかもしれません。
注釈:
Because the format depends on the current locale, care should be taken when making assumptions about the output value. Field orderings will vary (for example, "month/day/year" versus "day/month/year"), and the output may contain non-ASCII characters.
strptime()
メソッドは [1, 9999] の範囲の年数全てを構文解析できますが、 year < 1000 の範囲の年数は 0 埋めされた 4 桁の数字でなければなりません。バージョン 3.2 で変更: 以前のバージョンでは、
strftime()
メソッドは years >= 1900 の範囲の年数しか扱えませんでした。バージョン 3.3 で変更: バージョン 3.2 では、
strftime()
メソッドは years >= 1000 の範囲の年数しか扱えませんでした。strptime()
メソッドと共に使われた場合、%p
指定子は出力の時間フィールドのみに影響し、%I
指定子が使われたかのように振る舞います。time
モジュールと違い、datetime
モジュールはうるう秒をサポートしていません。strptime()
メソッドと共に使われた場合、%f
指定子は 1 桁から 6 桁の数字を受け付け、右側から0埋めされます。%f
は C 標準規格の書式文字セットの拡張です (とは言え、 datetime モジュールのオブジェクトそれぞれに実装されているので、どれででも使えます)。For a naive object, the
%z
and%Z
format codes are replaced by empty strings.aware オブジェクトでは次のようになります:
%z
utcoffset()
は±HHMM[SS[.ffffff]]
形式の文字列に変換されます。ここで、HH
は UTC オフセットの時間を表す 2 桁の文字列、MM
は UTC オフセットの分数を表す 2 桁の文字列、SS
は UTC オフセットの秒数を表す 2 桁の文字列、ffffff
は UTC オフセットのマイクロ秒数を表す 6 桁の文字列です。 オフセットに秒未満の端数が無いときはffffff
部分は省略され、オフセットに分未満の端数が無いときはffffff
部分もSS
部分も省略されます。 例えば、utcoffset()
がtimedelta(hours=-3, minutes=-30)
を返す場合、%z
は文字列'-0330'
に置き換えられます。
バージョン 3.7 で変更: UTC オフセットが分単位でなければならない制限が無くなりました。
バージョン 3.7 で変更:
%z
指定子がstrptime()
メソッドに渡されたときは、時分秒のセパレータとしてコロンが UTC オフセットで使えます。 例えば、'+01:00:00'
は 1 時間のオフセットだと構文解析されます。 加えて、'Z'
を渡すことは'+00:00'
を渡すことと同等です。%Z
In
strftime()
,%Z
is replaced by an empty string iftzname()
returnsNone
; otherwise%Z
is replaced by the returned value, which must be a string.strptime()
は%Z
に特定の値のみを受け入れます:使用しているマシンのロケールによる
time.tzname
の任意の値ハードコードされた値
UTC
またはGMT
つまり、日本に住んでいる場合は
JST
,UTC
とGMT
が有効な値であり、EST
はおそらく無効な値となります。無効な値の場合はValueError
を送出します。
バージョン 3.2 で変更:
%z
指定子がstrptime()
メソッドに与えられた場合、 aware なdatetime
オブジェクトが作成されます。返り値のtzinfo
はtimezone
インスタンスになっています。strptime()
メソッドと共に使われた場合、%U
と%W
指定子は、曜日と年(%Y
)が指定された場合の計算でのみ使われます。%U
および%W
と同様に、%V
は曜日と ISO 年 (%G
) がstrptime()
の書式文字列の中で指定された場合に計算でのみ使われます。%G
と%Y
は互いに完全な互換性を持たないことにも注意してください。strptime()
メソッドと共に使われるとき、書式%d
,%m
,%H
,%I
,%M
,%S
,%j
,%U
,%W
,%V
では先行ゼロは任意です。 書式%y
では先行ゼロは必須です。
脚注