日期和时间

使用Babel提供的日期和时间功能可以格式化标准Python datetimedatetime 对象并使用时区。

日期和时间格式设置

babel.dates.format_datetime(datetime=None, format='medium', tzinfo=None, locale=default_locale('LC_TIME'))

返回根据给定模式格式化的日期。

>>> from datetime import datetime
>>> dt = datetime(2007, 4, 1, 15, 30)
>>> format_datetime(dt, locale='en_US')
u'Apr 1, 2007, 3:30:00\u202fPM'

对于需要显示时区的任何模式:

>>> format_datetime(dt, 'full', tzinfo=get_timezone('Europe/Paris'),
...                 locale='fr_FR')
'dimanche 1 avril 2007, 17:30:00 heure d’été d’Europe centrale'
>>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
...                 tzinfo=get_timezone('US/Eastern'), locale='en')
u'2007.04.01 AD at 11:30:00 EDT'
参数:
  • datetime -- 这个 datetime 对象;如果 None ,则使用当前日期和时间

  • format -- “Full”、“Long”、“Medium”或“Short”之一,或自定义日期/时间模式

  • tzinfo -- 要应用于显示时间的时区

  • locale -- 一 Locale 对象或区域设置标识符

babel.dates.format_date(date=None, format='medium', locale=default_locale('LC_TIME'))

返回根据给定模式格式化的日期。

>>> from datetime import date
>>> d = date(2007, 4, 1)
>>> format_date(d, locale='en_US')
u'Apr 1, 2007'
>>> format_date(d, format='full', locale='de_DE')
u'Sonntag, 1. April 2007'

如果不想使用区域设置默认格式,可以指定自定义日期模式:

>>> format_date(d, "EEE, MMM d, ''yy", locale='en')
u"Sun, Apr 1, '07"
参数:
  • date -- 这个 datedatetime 对象;如果 None ,则使用当前日期

  • format -- “Full”、“Long”、“Medium”或“Short”之一,或自定义日期/时间模式

  • locale -- 一 Locale 对象或区域设置标识符

babel.dates.format_time(time=None, format='medium', tzinfo=None, locale=default_locale('LC_TIME'))

返回根据给定模式格式化的时间。

>>> from datetime import datetime, time
>>> t = time(15, 30)
>>> format_time(t, locale='en_US')
u'3:30:00\u202fPM'
>>> format_time(t, format='short', locale='de_DE')
u'15:30'

如果不想使用区域设置默认格式,可以指定自定义时间模式:

>>> format_time(t, "hh 'o''clock' a", locale='en')
u"03 o'clock PM"

对于任何需要显示时区的模式,必须明确指定时区:

>>> t = datetime(2007, 4, 1, 15, 30)
>>> tzinfo = get_timezone('Europe/Paris')
>>> t = _localize(tzinfo, t)
>>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR')
'15:30:00 heure d’été d’Europe centrale'
>>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=get_timezone('US/Eastern'),
...             locale='en')
u"09 o'clock AM, Eastern Daylight Time"

如该示例所示,当此函数传递给 datetime.datetime 值,则格式化字符串中的实际时间将调整为 tzinfo 参数。如果 datetime 是“原始的”(即它没有关联的时区信息),则假定它在UTC中。

这些时区计算是 not 如果值的类型为 datetime.time ,因为没有日期信息,如果没有关于夏令时是否有效的信息,就无法确定给定时间在不同时区将转换成什么。这意味着时间值保持原样,而 tzinfo 参数仅用于在需要时显示时区名称:

>>> t = time(15, 30)
>>> format_time(t, format='full', tzinfo=get_timezone('Europe/Paris'),
...             locale='fr_FR')  
u'15:30:00 heure normale d\u2019Europe centrale'
>>> format_time(t, format='full', tzinfo=get_timezone('US/Eastern'),
...             locale='en_US')  
u'3:30:00\u202fPM Eastern Standard Time'
参数:
  • time -- 这个 timedatetime 对象;如果 None ,则使用UTC的当前时间

  • format -- “Full”、“Long”、“Medium”或“Short”之一,或自定义日期/时间模式

  • tzinfo -- 要应用于显示时间的时区

  • locale -- 一 Locale 对象或区域设置标识符

babel.dates.format_timedelta(delta, granularity='second', threshold=.85, add_direction=False, format='long', locale=default_locale('LC_TIME'))

根据给定区域设置的规则返回时间增量。

>>> from datetime import timedelta
>>> format_timedelta(timedelta(weeks=12), locale='en_US')
u'3 months'
>>> format_timedelta(timedelta(seconds=1), locale='es')
u'1 segundo'

可以提供粒度参数来改变所呈现的最低单位,该最低单位默认为秒。

>>> format_timedelta(timedelta(hours=3), granularity='day', locale='en_US')
u'1 day'

阈值参数可用于确定呈现切换到下一个更高单位的值。阈值因子越高,表示演示文稿将稍后切换。例如:

>>> format_timedelta(timedelta(hours=23), threshold=0.9, locale='en_US')
u'1 day'
>>> format_timedelta(timedelta(hours=23), threshold=1.1, locale='en_US')
u'23 hours'

此外,还可以提供方向信息,通知用户日期是过去的还是将来的:

>>> format_timedelta(timedelta(hours=1), add_direction=True, locale='en')
u'in 1 hour'
>>> format_timedelta(timedelta(hours=-1), add_direction=True, locale='en')
u'1 hour ago'

Format参数控制演示文稿的紧凑程度或宽度:

>>> format_timedelta(timedelta(hours=3), format='short', locale='en')
u'3 hr'
>>> format_timedelta(timedelta(hours=3), format='narrow', locale='en')
u'3h'
参数:
  • delta -- 一 timedelta 对象,该对象表示要格式化的时间差,或以秒为单位的增量。 int 价值

  • granularity -- 确定应显示的最小单位,值可以是“年”、“月”、“周”、“日”、“小时”、“分钟”或“秒”中的一个

  • threshold -- 决定演示文稿切换到下一个更高单位的系数

  • add_direction -- 如果此标志设置为 True 返回值将包括方向信息。例如,正的时间增量将包括关于它是未来的信息,负的时间增量将包括关于过去的值的信息。

  • format -- 格式可以是“窄”、“短”或“长”。(“Medium”已弃用,当前已转换为“Long”以保持兼容性)

  • locale -- 一 Locale 对象或区域设置标识符

babel.dates.format_skeleton(skeleton, datetime=None, tzinfo=None, fuzzy=True, locale=default_locale('LC_TIME'))

返回根据给定模式格式化的时间和/或日期。

骨架在CLDR数据中定义,与简单的短/长/中格式相比提供了更大的灵活性,但使用起来有点困难。使用不带顺序或标点符号的日期/时间符号定义,并映射到适合给定区域设置的格式。

>>> from datetime import datetime
>>> t = datetime(2007, 4, 1, 15, 30)
>>> format_skeleton('MMMEd', t, locale='fr')
u'dim. 1 avr.'
>>> format_skeleton('MMMEd', t, locale='en')
u'Sun, Apr 1'
>>> format_skeleton('yMMd', t, locale='fi')  # yMMd is not in the Finnish locale; yMd gets used
u'1.4.2007'
>>> format_skeleton('yMMd', t, fuzzy=False, locale='fi')  # yMMd is not in the Finnish locale, an error is thrown
Traceback (most recent call last):
    ...
KeyError: yMMd

在将骨架解析为阵列之后 format_datetime ,所以所有时区处理等都与此相同。

参数:
  • skeleton -- CLDR数据中定义的日期时间框架。

  • datetime -- 这个 timedatetime 对象;如果 None ,则使用UTC的当前时间

  • tzinfo -- 要应用于显示时间的时区

  • fuzzy -- 如果找不到骨架,则允许选择与其足够接近的骨架。

  • locale -- 一 Locale 对象或区域设置标识符

babel.dates.format_interval(start, end, skeleton=None, tzinfo=None, fuzzy=True, locale=default_locale('LC_TIME'))

根据区域设置规则格式化两个实例之间的时间间隔。

>>> from datetime import date, time
>>> format_interval(date(2016, 1, 15), date(2016, 1, 17), "yMd", locale="fi")
u'15.–17.1.2016'
>>> format_interval(time(12, 12), time(16, 16), "Hm", locale="en_GB")
'12:12–16:16'
>>> format_interval(time(5, 12), time(16, 16), "hm", locale="en_US")
'5:12 AM – 4:16 PM'
>>> format_interval(time(16, 18), time(16, 24), "Hm", locale="it")
'16:18–16:24'

如果开始时刻等于结束时刻,则间隔的格式类似于该时刻。

>>> format_interval(time(16, 18), time(16, 18), "Hm", locale="it")
'16:18'

未知的框架回退到“默认”格式。

>>> format_interval(date(2015, 1, 1), date(2017, 1, 1), "wzq", locale="ja")
'2015/01/01~2017/01/01'
>>> format_interval(time(16, 18), time(16, 24), "xxx", locale="ja")
'16:18:00~16:24:00'
>>> format_interval(date(2016, 1, 15), date(2016, 1, 17), "xxx", locale="de")
'15.01.2016 – 17.01.2016'
参数:
  • start -- 第一个即时(日期时间/日期/时间)

  • end -- 第二个即时(日期时间/日期/时间)

  • skeleton -- 用于格式化的“主干格式”。

  • tzinfo -- 要使用的tzinfo(如果尚未附加任何内容)

  • fuzzy -- 如果找不到骨架,则允许选择与其足够接近的骨架。

  • locale -- 区域设置对象或标识符。

返回:

格式化间隔

时区功能

babel.dates.get_timezone(zone: str | tzinfo | None = None) tzinfo

按名称查找时区并返回该时区。返回的时区对象来自 pytzzoneinfo ,视乎可用的情况而定。它对应于 tzinfo 界面,并且可以与使用日期操作的所有巴别塔函数一起使用。

如果时区未知,则 LookupError 提高了。如果 zoneNone 返回一个本地区域对象。

参数:

zone -- 要查找的时区的名称。如果传入的是时区对象本身,则返回时不变。

babel.dates.get_timezone_gmt(datetime: _Instant = None, width: Literal['long', 'short', 'iso8601', 'iso8601_short'] = 'long', locale: Locale | str | None = 'en_US', return_z: bool = False) str

返回与给定的 datetime 格式为字符串的对象,指示与GMT的偏移量。

>>> from datetime import datetime
>>> dt = datetime(2007, 4, 1, 15, 30)
>>> get_timezone_gmt(dt, locale='en')
u'GMT+00:00'
>>> get_timezone_gmt(dt, locale='en', return_z=True)
'Z'
>>> get_timezone_gmt(dt, locale='en', width='iso8601_short')
u'+00'
>>> tz = get_timezone('America/Los_Angeles')
>>> dt = _localize(tz, datetime(2007, 4, 1, 15, 30))
>>> get_timezone_gmt(dt, locale='en')
u'GMT-07:00'
>>> get_timezone_gmt(dt, 'short', locale='en')
u'-0700'
>>> get_timezone_gmt(dt, locale='en', width='iso8601_short')
u'-07'

长格式取决于区域设置,例如,在法国,使用首字母缩写UTC字符串代替GMT:

>>> get_timezone_gmt(dt, 'long', locale='fr_FR')
u'UTC-07:00'

在 0.9 版本加入.

参数:
  • datetime -- 这个 datetime 对象;如果 None ,则使用UTC的当前日期和时间

  • width -- “Long”或“Short”或“iso8601”或“iso8601_Short”

  • locale -- 这个 Locale 对象或区域设置字符串

  • return_z -- TRUE或FALSE;当本地时间偏移量为0时,函数返回指示符“Z

babel.dates.get_timezone_location(dt_or_tzinfo: _DtOrTzinfo = None, locale: Locale | str | None = 'en_US', return_city: bool = False) str

使用“位置格式”返回给定时区的表示形式。

结果取决于与时区关联的国家/地区和城市的本地显示名称:

>>> tz = get_timezone('America/St_Johns')
>>> print(get_timezone_location(tz, locale='de_DE'))
Kanada (St. John’s) (Ortszeit)
>>> print(get_timezone_location(tz, locale='en'))
Canada (St. John’s) Time
>>> print(get_timezone_location(tz, locale='en', return_city=True))
St. John’s
>>> tz = get_timezone('America/Mexico_City')
>>> get_timezone_location(tz, locale='de_DE')
u'Mexiko (Mexiko-Stadt) (Ortszeit)'

如果时区与仅使用单个时区的国家/地区相关联,则仅返回本地化的国家/地区名称:

>>> tz = get_timezone('Europe/Berlin')
>>> get_timezone_name(tz, locale='de_DE')
u'Mitteleurop\xe4ische Zeit'

在 0.9 版本加入.

参数:
  • dt_or_tzinfo -- 这个 datetimetzinfo 对象,该对象确定时区;如果 None ,则假定当前日期和时间为UTC

  • locale -- 这个 Locale 对象或区域设置字符串

  • return_city -- True或False,如果为True,则返回时区的样本城市(位置

返回:

使用位置格式的本地化时区名称

babel.dates.get_timezone_name(dt_or_tzinfo: _DtOrTzinfo = None, width: Literal['long', 'short'] = 'long', uncommon: bool = False, locale: Locale | str | None = 'en_US', zone_variant: Literal['generic', 'daylight', 'standard'] | None = None, return_zone: bool = False) str

返回给定时区的本地化显示名称。时区可以使用 datetimetzinfo 对象。

>>> from datetime import time
>>> dt = time(15, 30, tzinfo=get_timezone('America/Los_Angeles'))
>>> get_timezone_name(dt, locale='en_US')  
u'Pacific Standard Time'
>>> get_timezone_name(dt, locale='en_US', return_zone=True)
'America/Los_Angeles'
>>> get_timezone_name(dt, width='short', locale='en_US')  
u'PST'

如果此函数仅传递给 tzinfo 对象而不是具体的 datetime ,则返回的显示名称与夏令时无关。例如,这可用于选择时区,或设置跨DST更改重复发生的事件的时间:

>>> tz = get_timezone('America/Los_Angeles')
>>> get_timezone_name(tz, locale='en_US')
u'Pacific Time'
>>> get_timezone_name(tz, 'short', locale='en_US')
u'PT'

如果没有可用的时区本地化显示名称,并且该时区与仅使用单个时区的国家/地区相关联,则将返回该国家/地区的名称,并根据区域设置进行格式设置:

>>> tz = get_timezone('Europe/Berlin')
>>> get_timezone_name(tz, locale='de_DE')
u'Mitteleurop\xe4ische Zeit'
>>> get_timezone_name(tz, locale='pt_BR')
u'Hor\xe1rio da Europa Central'

另一方面,如果国家/地区使用多个时区,则该城市也包括在表示中:

>>> tz = get_timezone('America/St_Johns')
>>> get_timezone_name(tz, locale='de_DE')
u'Neufundland-Zeit'

请注意,目前并不是所有时区和所有区域设置都支持短格式。这在一定程度上是因为不是每个时区在每个地区都有短码。在这种情况下,它目前回落到长格式。

有关详细信息,请参阅 LDML Appendix J: Time Zone Display Names

在 0.9 版本加入.

在 1.0 版本发生变更: 补充 zone_variant 支持。

参数:
  • dt_or_tzinfo -- 这个 datetimetzinfo 对象,该对象确定时区;如果 tzinfo 对象,则结果显示名称将是通用的,即与夏令时无关;如果 None ,则假定当前日期为UTC

  • width -- “做多”或“做空”

  • uncommon -- 已弃用和忽略

  • zone_variant -- 定义要返回的区域变量。默认情况下,变体是从传入的DateTime对象定义的。如果没有传入DateTime对象,则 'generic' 假设存在变异。以下值有效: 'generic''daylight''standard' .

  • locale -- 这个 Locale 对象或区域设置字符串

  • return_zone -- 对或错。如果为TRUE,则函数返回长时区ID

babel.dates.UTC

UTC的时区对象。

babel.dates.LOCALTZ

计算机本地时区的时区对象。

数据访问

babel.dates.get_period_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', context: _Context = 'stand-alone', locale: Locale | str | None = 'en_US') LocaleDataDict

返回区域设置使用的天段(AM/PM)的名称。

>>> get_period_names(locale='en_US')['am']
u'AM'
参数:
  • width -- 要使用的宽度,可以是“缩写”、“窄”或“宽”之一

  • context -- 上下文,“格式”或“独立”

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_day_names(width: Literal['abbreviated', 'narrow', 'short', 'wide'] = 'wide', context: _Context = 'format', locale: Locale | str | None = 'en_US') LocaleDataDict

返回指定格式的区域设置使用的日期名称。

>>> get_day_names('wide', locale='en_US')[1]
u'Tuesday'
>>> get_day_names('short', locale='en_US')[1]
u'Tu'
>>> get_day_names('abbreviated', locale='es')[1]
u'mar'
>>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1]
u'D'
参数:
  • width -- 要使用的宽度,“宽”、“缩写”、“短”或“窄”之一

  • context -- 上下文,“格式”或“独立”

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_month_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', context: _Context = 'format', locale: Locale | str | None = 'en_US') LocaleDataDict

返回指定格式的区域设置使用的月份名称。

>>> get_month_names('wide', locale='en_US')[1]
u'January'
>>> get_month_names('abbreviated', locale='es')[1]
u'ene'
>>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1]
u'J'
参数:
  • width -- 要使用的宽度,“宽”、“缩写”或“窄”之一

  • context -- 上下文,“格式”或“独立”

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_quarter_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', context: _Context = 'format', locale: Locale | str | None = 'en_US') LocaleDataDict

返回指定格式的区域设置使用的季度名称。

>>> get_quarter_names('wide', locale='en_US')[1]
u'1st quarter'
>>> get_quarter_names('abbreviated', locale='de_DE')[1]
u'Q1'
>>> get_quarter_names('narrow', locale='de_DE')[1]
u'1'
参数:
  • width -- 要使用的宽度,“宽”、“缩写”或“窄”之一

  • context -- 上下文,“格式”或“独立”

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_era_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', locale: Locale | str | None = 'en_US') LocaleDataDict

返回指定格式的区域设置使用的纪元名称。

>>> get_era_names('wide', locale='en_US')[1]
u'Anno Domini'
>>> get_era_names('abbreviated', locale='de_DE')[1]
u'n. Chr.'
参数:
  • width -- 要使用的宽度,可以是“宽”、“缩写”或“窄”

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_date_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = 'en_US') DateTimePattern

返回区域设置为指定格式使用的日期格式模式。

>>> get_date_format(locale='en_US')
<DateTimePattern u'MMM d, y'>
>>> get_date_format('full', locale='de_DE')
<DateTimePattern u'EEEE, d. MMMM y'>
参数:
  • format -- 要使用的格式为“Full”、“Long”、“Medium”或“Short”之一

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_datetime_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = 'en_US') DateTimePattern

返回区域设置为指定格式使用的日期时间格式模式。

>>> get_datetime_format(locale='en_US')
u'{1}, {0}'
参数:
  • format -- 要使用的格式为“Full”、“Long”、“Medium”或“Short”之一

  • locale -- 这个 Locale 对象或区域设置字符串

babel.dates.get_time_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = 'en_US') DateTimePattern

返回指定格式的区域设置使用的时间格式模式。

>>> get_time_format(locale='en_US')
<DateTimePattern u'h:mm:ss a'>
>>> get_time_format('full', locale='de_DE')
<DateTimePattern u'HH:mm:ss zzzz'>
参数:
  • format -- 要使用的格式为“Full”、“Long”、“Medium”或“Short”之一

  • locale -- 这个 Locale 对象或区域设置字符串

基本解析

babel.dates.parse_date(string: str, locale: Locale | str | None = 'en_US', format: _PredefinedTimeFormat = 'medium') datetime.date

从字符串解析日期。

此函数首先尝试将字符串解释为ISO-8601日期格式,然后使用区域设置的日期格式作为提示,以确定日期字段在字符串中的出现顺序。

>>> parse_date('4/1/04', locale='en_US')
datetime.date(2004, 4, 1)
>>> parse_date('01.04.2004', locale='de_DE')
datetime.date(2004, 4, 1)
>>> parse_date('2004-04-01', locale='en_US')
datetime.date(2004, 4, 1)
>>> parse_date('2004-04-01', locale='de_DE')
datetime.date(2004, 4, 1)
参数:
  • string -- 包含日期的字符串

  • locale -- 一 Locale 对象或区域设置标识符

  • format -- 要使用的格式(请参见 get_date_format )

babel.dates.parse_time(string: str, locale: Locale | str | None = 'en_US', format: _PredefinedTimeFormat = 'medium') datetime.time

从字符串解析时间。

此函数使用区域设置的时间格式作为提示,以确定时间字段在字符串中的显示顺序。

>>> parse_time('15:30:00', locale='en_US')
datetime.time(15, 30)
参数:
  • string -- 包含时间的字符串

  • locale -- 一 Locale 对象或区域设置标识符

  • format -- 要使用的格式(请参见 get_time_format )

返回:

解析的时间

返回类型:

time

babel.dates.parse_pattern(pattern: str | DateTimePattern) DateTimePattern

解析日期、时间和日期时间格式模式。

>>> parse_pattern("MMMMd").format
u'%(MMMM)s%(d)s'
>>> parse_pattern("MMM d, yyyy").format
u'%(MMM)s %(d)s, %(yyyy)s'

模式可以在单引号中包含文字字符串:

>>> parse_pattern("H:mm' Uhr 'z").format
u'%(H)s:%(mm)s Uhr %(z)s'

可以通过使用两个相邻的单引号字符来使用实际的单引号:

>>> parse_pattern("hh' o''clock'").format
u"%(hh)s o'clock"
参数:

pattern -- 要分析的格式化模式