日期和时间¶
使用Babel提供的日期和时间功能可以格式化标准Python datetime , date 和 time 对象并使用时区。
日期和时间格式设置¶
- 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 -- 这个
date
或datetime
对象;如果 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 -- 这个
time
或datetime
对象;如果 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 -- 这个
time
或datetime
对象;如果 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 ¶
按名称查找时区并返回该时区。返回的时区对象来自
pytz
或zoneinfo
,视乎可用的情况而定。它对应于 tzinfo 界面,并且可以与使用日期操作的所有巴别塔函数一起使用。如果时区未知,则
LookupError
提高了。如果 zone 是None
返回一个本地区域对象。- 参数:
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 -- 这个
datetime
或tzinfo
对象,该对象确定时区;如果 None ,则假定当前日期和时间为UTClocale -- 这个 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 ¶
返回给定时区的本地化显示名称。时区可以使用
datetime
或 tzinfo 对象。>>> 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 -- 这个
datetime
或tzinfo
对象,该对象确定时区;如果tzinfo
对象,则结果显示名称将是通用的,即与夏令时无关;如果 None ,则假定当前日期为UTCwidth -- “做多”或“做空”
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 -- 要分析的格式化模式