日付と時間

When working with date and time information in Python, you commonly use the classes date, datetime and/or time from the datetime package. Babel provides functions for locale-specific formatting of those objects in its dates module:

>>> from datetime import date, datetime, time
>>> from babel.dates import format_date, format_datetime, format_time

>>> d = date(2007, 4, 1)
>>> format_date(d, locale='en')
u'Apr 1, 2007'
>>> format_date(d, locale='de_DE')
u'01.04.2007'

本例に示すように、Babelは、要求された領域の設定に適した日付フォーマットを自動的に選択する。

♪the format_*() 関数はオプションでも受け入れられます format 4つのフォーマット変形のうちの1つを選択することを可能にするパラメータ:

  • short,

  • medium (デフォルト値)、

  • long そして、

  • full それがそうです。

例:

>>> format_date(d, format='short', locale='en')
u'4/1/07'
>>> format_date(d, format='long', locale='en')
u'April 1, 2007'
>>> format_date(d, format='full', locale='en')
u'Sunday, April 1, 2007'

コア時間概念

日付と時間を処理することは複雑なことかもしれない。バベルタはあなたのためにいくつかの決定をすることで彼らとの協力を単純化しようと努力している。PythonのDateTimeモジュールは、時間と日付を処理する異なる方法を持っています:シンプルでタイムゾーンをサポートするDateTimeオブジェクト。

Babelは通常、すべての時間を素朴なDateTimeオブジェクトに保存し、常にUTCと見なすことをお勧めします。これは、時間の処理を大幅に簡略化します。そうでなければ、異なるタイムゾーンのDateTimeオブジェクトを処理する面倒な状況に遭遇する可能性があります。場合によっては時間が曖昧かもしれないので、これは難しい。時間帯切替え前後の日付を扱う場合には,通常このような場合がある.タイムゾーン変換の最も一般的な場合は、サマータイムと標準時間との間の変更である。

したがって、我々は、常に内部でUTCを使用し、日付がユーザに返されたときにのみローカル時間に再フォーマットすることを提案する。この点で、ユーザが選択した時間帯は通常確立することができ、Babelは自動的に時間基準を再調整することができる。

現在の時間を取得する場合は、ご利用ください utcnow() 方法 datetime 物体です。それはまだ幼稚になるだろう datetime 対象は,UTCで表す.

タイムゾーンの詳細については、ご参照ください 時間帯サポート それがそうです。

モード文法

Babelは、所与の領域に適切な日付/時間フォーマットを使用するように設定することを簡単にしますが、カスタムモードの使用を強制することもできます。Babelは、Python等価項と比較して、異なるパターンを使用して数字および日付フォーマット(例えば、 time.strftime() )、それらの多くは、CおよびPOSIXから継承される。バ別塔で使われているモデルは Locale Data Markup Language specification (LDML)は,以下のように定義される.

日付/時間パターンは、特定の文字列がフォーマット時にカレンダー内の日付および時間データに置き換えられるか、または分析時にカレンダーデータを生成するための文字列である。 […]

文字は何度でも使えます。例えばもし y この1年間で使われています yy “99”が生じるかもしれません yyyy “1999”を作成した。ほとんどの数値フィールドの場合、文字数はフィールド幅を指定する。例えばもし h もう時間だ。 h “5”が生じるかもしれませんが hh “05”を生成する。いくつかの文字の場合、カウントは略語形式を使用すべきか完全形式を使用すべきかを指定 […]

2つの単引用符は字面上の単引用符を表し、単引用符内でも単引用符外でもある。単引用符内のテキストはいかなる方法でも解釈されない(2つの隣接する単引用符を除く).

例:

>>> d = date(2007, 4, 1)
>>> format_date(d, "EEE, MMM d, ''yy", locale='en')
u"Sun, Apr 1, '07"
>>> format_date(d, "EEEE, d.M.yyyy", locale='de')
u'Sonntag, 1.4.2007'

>>> t = time(15, 30)
>>> format_time(t, "hh 'o''clock' a", locale='en')
u"03 o'clock PM"
>>> format_time(t, 'H:mm a', locale='de')
u'15:30 nachm.'

>>> dt = datetime(2007, 4, 1, 15, 30)
>>> format_datetime(dt, "yyyyy.MMMM.dd GGG hh:mm a", locale='en')
u'02007.April.01 AD 03:30 PM'

カスタム日時フォーマットパターンの文法は Locale Data Markup Language specification それがそうです。次の表は比較的簡単な概要に過ぎない。

日付フィールド.

フィールド.フィールド

記号

説明する.

新紀元.

G

現在の日付の紀元文字列に置き換える.1~3文字の略語で、長式は4文字、狭い式は5文字です

y

代わりに年です通常,長さはパディングを指定するが,2文字に対しては最大長も指定する.

Y

相同 y しかしISO年-周暦を使っています。ISO年−完成1年の最終週後の週増量。したがって、それは数日前か数日後に変化するかもしれない。 y それがそうです。提案と w 記号です。

u

知ってる?

Q

数字四半期を1または2で表し,略語を3で表すか,フルネームを4で表す.

q

数字四半期を1または2で表し,略語を3で表すか,フルネームを4で表す.

M

数字の月を1または2,略語を3,フルネームを4,または狭義の名前を5で表す.

L

数字の月を1または2,略語を3,フルネームを4,または狭義の名前を5で表す.

w

ISO年-周暦によると、1年の何週目ですか。年によっては、これは52週間か53週の時間があるかもしれない。提案と Y 象徴する。

W

毎月の曜日です。

一日

d

毎月の何日ですか。

D

一年のどの日ですか。

F

毎月の曜日です。

g

知ってる?

日曜日

E

一週間のうちの何日ですか。短い日付を1文字から3文字で表すか,フルネームを4文字で表すか,狭義の名前を5文字で表す.

e

現地の一週間のどの日ですか。Eと同様に、1週間のローカル開始日に依存する1つまたは2つの文字を使用して1つの数値を追加する点が異なる。

c

知ってる?

時間フィールド.

フィールド.フィールド

記号

説明する.

期間

a

午前あるいは午後

h

時 [1-12] それがそうです。

H

時 [0-23] それがそうです。

K

時 [0-11] それがそうです。

k

時 [1-24] それがそうです。

m

ゼロビットパッドとして1つまたは2つを使用します。

第二に

s

ゼロビットパッドとして1つまたは2つを使用します。

S

小数秒、四捨五入はアルファベットカウント。

A

日単位のミリ秒数.

時間帯.

z

短時間帯は1文字から3文字、フルネームは4文字を使用します。

Z

RFC 822は1~3文字を使用し、GMTフォーマットは4文字を使用する。

v

1文字で短い時間を表し、4文字で長時間を表す。

V

相同 z しかしながら、時間領域の略語は、領域のために一般的な略語を設定するか否かにかかわらず使用されるべきである。

時間増分フォーマット設定

現地化された日付と時間フォーマットを設定する関数を提供するほか、 babel.dates モジュールはまた、“時間増分”と呼ばれる2つの時間間の差をフォーマットする関数を提供する。これらは一般的に datetime.timedelta 対象者、これも1つ引いたものです datetime オブジェクトは別のオブジェクトから来ている.

♪the format_timedelta 関数は1つを使用する timedelta オブジェクトは,人間が可読な表示形式に戻る.これは、差異の中で最も重要な単位(年、週、または時間のような)のみを選択し、表示するため、精度を犠牲にしている。

>>> from datetime import timedelta
>>> from babel.dates import format_timedelta
>>> delta = timedelta(days=6)
>>> format_timedelta(delta, locale='en_US')
u'1 week'

結果文字列はCLDRデータに基づいて、領域に設定された複数のルールと計算された単位数に基づいて適切な複数を行う。

この関数は、この最も重要な単位をどのように選択するかに影響を与えるパラメータを提供する: threshold 値を設定すると,プレゼンテーションは次のより大きな単位に切り替えて使用される. granularity 表示の最小単位を制限することができます

>>> delta = timedelta(days=6)
>>> format_timedelta(delta, threshold=1.2, locale='en_US')
u'6 days'
>>> format_timedelta(delta, granularity='month', locale='en_US')
u'1 month'

時間帯サポート

多くの詳細な時間フォーマットにはタイムゾーンが含まれていますが、デフォルトの場合、タイムゾーン情報はPythonには適用されません。 datetime そして time 物体です。標準ライブラリには要約のみが含まれている tzinfo クラスは、アプリケーションで実際に使用するために適切な実装が必要です。バベルタワーには1つが含まれています tzinfo UTC(世界時)を実現する。

バーベルタワー使用 pytz リアルタイム時間領域は、世界で使用されるほとんどの時間領域の定義と、UTC時間をローカル時間(その逆)に確実に変換する重要な機能とを含む。モジュールは通常あなたのために包装されていますので、Babelから直接対話することができます。

>>> from datetime import time
>>> from babel.dates import get_timezone, UTC
>>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=UTC)
>>> eastern = get_timezone('US/Eastern')
>>> format_datetime(dt, 'H:mm Z', tzinfo=eastern, locale='en_US')
u'11:30 -0400'

Pythonアプリケーションで異なるタイムゾーンを処理する推奨方法は、常に内部でUTCを使用し、ユーザの入力および表示日時データを受け付けたときにのみ、それぞれユーザタイムゾーンからユーザタイムゾーンに変換することである。バベルタと一緒にバーベル塔を使うことができます pytz 時間帯をどのようなものにも適用しなければなりません datetime あるいは…。 time 表示するオブジェクトは、元の情報をそのまま保持しています。

>>> british = get_timezone('Europe/London')
>>> format_datetime(dt, 'H:mm zzzz', tzinfo=british, locale='en_US')
u'16:30 British Summer Time'

ここで、所与のUTC時間は“ヨーロッパ/ロンドン”時間帯に調整され、サマータイムを考慮する。サマータイムは format_time ただし,この場合は実際の日付は未知であるため,DSTを使用すべきか標準時間を決定すべきかを当日に決定すると仮定する.

多くのタイムゾーンについては、次のタイムゾーン変換が要求されてもよい。例えば、これは、“次は時計をいつにしなければならないのか”という質問に答えるのに有用です。

>>> t = get_next_timezone_transition('Europe/Vienna', datetime(2011, 3, 2))
>>> t
<TimezoneTransition CET -> CEST (2011-03-27 01:00:00)>
>>> t.from_offset
3600.0
>>> t.to_offset
7200.0
>>> t.from_tz
'CET'
>>> t.to_tz
'CEST'

最後に、Babelはまたオペレーティングシステムを使用するローカルタイムゾーンをサポートする。これは LOCALTZ 定数:

>>> from babel.dates import LOCALTZ, get_timezone_name
>>> LOCALTZ
<DstTzInfo 'Europe/Vienna' CET+1:00:00 STD>
>>> get_timezone_name(LOCALTZ)
u'Central European Time'

現地化タイムゾーン名

当. Locale クラスは,タイムゾーンに関連する様々な領域に名前を表示するアクセスを提供するが,タイムゾーンのローカル化された名前を構築する過程は実際には複雑である.Babelはいる babel.dates モジュールで最も重要なのは get_timezone_name 機能:

>>> from babel import Locale
>>> from babel.dates import get_timezone_name, get_timezone

>>> tz = get_timezone('Europe/Berlin')
>>> get_timezone_name(tz, locale=Locale.parse('pt_PT'))
u'Hora da Europa Central'

この関数を datetime.tzinfo 対象、または1つ datetime.date あるいは…。 datetime.datetime 物体です。もしあなたが実際の日付を伝えるなら、この関数は夏時間を考慮することができるだろう。タイムゾーンのみを伝達すると,Babelはサマータイムが有効かどうか分からないため,汎用表現法を用いて,たとえばタイムゾーンリストをユーザに表示する際に有用である.

>>> from datetime import datetime

>>> dt = tz.localize(datetime(2007, 8, 15))
>>> get_timezone_name(dt, locale=Locale.parse('de_DE'))
u'Mitteleurop\xe4ische Sommerzeit'
>>> get_timezone_name(tz, locale=Locale.parse('de_DE'))
u'Mitteleurop\xe4ische Zeit'