Format Dates¶
Language-sensitive date, time, and relative time formatting.
Basic¶
Set the date style to format dates.
Note that dates must be ISO 8601 formatted, with time zone information.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
box('=Active: {now date}', data=dict(now=now)), # Active locale
box('=US: {now date}', data=dict(now=now), locale='en-US'),
box('=Germany: {now date}', data=dict(now=now), locale='de-DE'),
box('=Egypt: {now date}', data=dict(now=now), locale='ar-EG'),
box('=India: {now date}', data=dict(now=now), locale='en-IN'),
box('=UK: {now date}', data=dict(now=now), locale='en-GB'),
)

Time¶
Set the time style to format time.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
box('=Active: {now time}', data=dict(now=now)), # Active locale
box('=US: {now time}', data=dict(now=now), locale='en-US'),
box('=Germany: {now time}', data=dict(now=now), locale='de-DE'),
box('=Egypt: {now time}', data=dict(now=now), locale='ar-EG'),
box('=India: {now time}', data=dict(now=now), locale='en-IN'),
box('=UK: {now time}', data=dict(now=now), locale='en-GB'),
)

Date and time¶
Set both date and time styles to format date and time.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
box('=Active: {now date time}', data=dict(now=now)), # Active locale
box('=US: {now date time}', data=dict(now=now), locale='en-US'),
box('=Germany: {now date time}', data=dict(now=now), locale='de-DE'),
box('=Egypt: {now date time}', data=dict(now=now), locale='ar-EG'),
box('=India: {now date time}', data=dict(now=now), locale='en-IN'),
box('=UK: {now date time}', data=dict(now=now), locale='en-GB'),
)

Date style¶
Add one of date-xl (extra long), date-l (long), date-m (medium), or date-s (short) styles for additional control.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
'## US',
box('=Full: {now date-xl}', data=dict(now=now), locale='en-US'),
box('=Long: {now date-l}', data=dict(now=now), locale='en-US'),
box('=Medium: {now date-m}', data=dict(now=now), locale='en-US'),
box('=Short: {now date-s}', data=dict(now=now), locale='en-US'),
'## UK',
box('=Full: {now date-xl}', data=dict(now=now), locale='en-GB'),
box('=Long: {now date-l}', data=dict(now=now), locale='en-GB'),
box('=Medium: {now date-m}', data=dict(now=now), locale='en-GB'),
box('=Short: {now date-s}', data=dict(now=now), locale='en-GB'),
)

Time style¶
Add one of time-xl (extra long), time-l (long), time-m (medium), or time-s (short) styles for additional control.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
'## US',
box('=Full: {now time-xl}', data=dict(now=now), locale='en-US'),
box('=Long: {now time-l}', data=dict(now=now), locale='en-US'),
box('=Medium: {now time-m}', data=dict(now=now), locale='en-US'),
box('=Short: {now time-s}', data=dict(now=now), locale='en-US'),
'## UK',
box('=Full: {now time-xl}', data=dict(now=now), locale='en-GB'),
box('=Long: {now time-l}', data=dict(now=now), locale='en-GB'),
box('=Medium: {now time-m}', data=dict(now=now), locale='en-GB'),
box('=Short: {now time-s}', data=dict(now=now), locale='en-GB'),
)

Calendar¶
Set cal-* to set the calendar to use.
Possible values include cal-buddhist, cal-chinese, cal-coptic, cal-dangi, cal-ethioaa, cal-ethiopic, cal-gregory, cal-hebrew, cal-indian, cal-islamic, cal-islamic-umalqura, cal-islamic-tbla, cal-islamic-civil, cal-islamic-rgsa, cal-iso8601, cal-japanese, cal-persian, cal-roc.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=ISO: {now}', data=dict(now=now)), # Raw date string (not formatted)
box('=Buddhist: {now cal-buddhist}', data=dict(now=now)),
box('=Hebrew: {now cal-hebrew}', data=dict(now=now)),
box('=Indian: {now cal-indian}', data=dict(now=now)),
box('=Islamic: {now cal-islamic}', data=dict(now=now)),
box('=Japanese: {now cal-japanese}', data=dict(now=now)),
)

Custom¶
For custom date/time formatting, use the following styles instead of date and time:
y: numeric year.yy: 2-digit year.M: numeric month.MM: 2-digit month.M-l: long month.M-s: short hours.M-xs: extra-short hours.w-l: long weekday.w-s: short weekday.w-xs: extra-short weekday.d: numeric day.dd: 2-digit day.h: numeric hours.hh: 2-digit hours.m: numeric minutes.mm: 2-digit minutes.s: numeric seconds.ss: 2-digit seconds.fs-0tofs-3: number of fractional second digits (0to3)
Additionally, if h or hh are set, use h12, h24, h11, or h23 to control the hour cycle to use.
The following combinations are supported:
w y M d h m sw y M dy M dy MM dh m sh m
The order of styles does not matter (e.g. h m is the same as m h).
now = datetime.datetime.now().astimezone().isoformat()
view(
box('={now}', data=dict(now=now)), # Raw date
box('={now w-l y M d h m s}', data=dict(now=now)),
box('={now w-s y M d}', data=dict(now=now)),
box('={now y M d}', data=dict(now=now)),
box('={now yy MM dd}', data=dict(now=now)),
box('={now h m s}', data=dict(now=now)),
box('={now hh mm ss h24}', data=dict(now=now)),
box('={now hh mm h11}', data=dict(now=now)),
)

Day period¶
Set one of period-l (long), period-s (short), or period-xs (extra-short) to control day periods like "in the morning", "am", "noon", "n" etc.
Note that this style only has an effect if a 12-hour clock is used, and many locales use the same string irrespective of the style specified.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=Long: {now period-l}', data=dict(now=now)),
box('=Short: {now period-s}', data=dict(now=now)),
box('=Extra-short: {now period-xs}', data=dict(now=now)),
)

Era¶
Set one of era-l (long), era-s (short), or era-xs (extra-short) to control the era.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=Long: {now era-l}', data=dict(now=now)),
box('=Short: {now era-s}', data=dict(now=now)),
box('=Extra-short: {now era-xs}', data=dict(now=now)),
)

Time zone¶
Set a tz-* style to control the time zone display.
tz-lLong localized form (e.g., Pacific Standard Time, Nordamerikanische Westküsten-Normalzeit)tz-sShort localized form (e.g.: PST, GMT-8)tz-offset-lLong localized GMT format (e.g., GMT-0800)tz-offset-sShort localized GMT format (e.g., GMT-8)tz-generic-sLong generic non-location format (e.g.: Pacific Time, Nordamerikanische Westküstenzeit)tz-generic-sShort generic non-location format (e.g.: PT, Los Angeles Zeit).
Note: Timezone display may fall back to another format if a required string is unavailable. For example, the non-location formats should display the timezone without a specific country/city location like "Pacific Time", but may fall back to a timezone like "Los Angeles Time".
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=Long: {now tz-l}', data=dict(now=now)),
box('=Short: {now tz-s}', data=dict(now=now)),
box('=Offset, long: {now tz-offset-l}', data=dict(now=now)),
box('=Offset, short: {now tz-offset-s}', data=dict(now=now)),
box('=Generic, long: {now tz-generic-l}', data=dict(now=now)),
box('=Generic, short: {now tz-generic-s}', data=dict(now=now)),
)

Numbering¶
Set a numbering-* style to change the numbering system.
Possible values include arab, arabext, bali, beng, deva, fullwide, gujr, guru, hanidec, khmr, knda, laoo, latn, limb, mlym, mong, mymr, orya, tamldec, telu, thai, tibt.
now = datetime.datetime.now().astimezone().isoformat()
view(
box('=Arabic: {now date time numbering-arab}', data=dict(now=now)),
box('=Devanagari: {now date time numbering-deva}', data=dict(now=now)),
box('=Gurumukhi: {now date time numbering-guru}', data=dict(now=now)),
box('=Kannada: {now date time numbering-knda}', data=dict(now=now)),
box('=Thai: {now date time numbering-thai}', data=dict(now=now)),
)

Relative Time¶
Set the rel style to enable language-sensitive relative time formatting (e.g. "10 days ago").
rel y: Relative years.rel q: Relative quarters.rel M: Relative months.rel W: Relative weeks.rel d: Relative days.rel h: Relative hours.rel m: Relative minutes.rel s: Relative seconds.
Use rel-l (long), rel-s (short), or rel-xs (extra-short) to control the message length. The rel-xs style could be similar to the rel-s style for some locales.
Add the abbr (abbreviate) style to omit numbers if possible (e.g. "yesterday" instead of "1 day ago").
view(
# Negative values
box('=Created {age rel y}', data=dict(age=-10)),
box('=Created {age rel q}', data=dict(age=-10)),
box('=Created {age rel M}', data=dict(age=-10)),
box('=Created {age rel W}', data=dict(age=-10)),
box('=Created {age rel d}', data=dict(age=-10)),
box('=Created {age rel h}', data=dict(age=-10)),
box('=Created {age rel m}', data=dict(age=-10)),
box('=Created {age rel s}', data=dict(age=-10)),
# Positive values
box('=Expires {age rel m}', data=dict(age=10)),
# Long
box('=Expires {age rel-l m}', data=dict(age=10)),
# Short
box('=Expires {age rel-s m}', data=dict(age=10)),
# Extra short
box('=Expires {age rel-xs m}', data=dict(age=10)),
# Shorten '1 day ago' to 'yesterday'
box('=Expires {age rel d abbr}', data=dict(age=-1)),
# Shorten 'in 0 days' to 'today'.
box('=Expires {age rel d abbr}', data=dict(age=0)),
# Shorten 'in 1 day' to 'tomorrow'
box('=Expires {age rel d abbr}', data=dict(age=1)),
# Shorten 'in 0 hours' to 'this hour'
box('=Expires {age rel h abbr}', data=dict(age=0)),
)
