date_i18n( string $dateformatstring, int|bool $timestamp_with_offset = false, bool $gmt = false )
Retrieve the date in localized format, based on a sum of Unix timestamp and timezone offset in seconds.
Description Description
If the locale specifies the locale month and weekday, then the locale will take over the format for the date. If it isn’t, then the date format string will be used instead.
Parameters Parameters
- $dateformatstring
-
(string) (Required) Format to display the date.
- $timestamp_with_offset
-
(int|bool) (Optional) A sum of Unix timestamp and timezone offset in seconds.
Default value: false
- $gmt
-
(bool) (Optional) Whether to use GMT timezone. Only applies if timestamp is not provided.
Default value: false
Return Return
(string) The date, translated if locale specifies it.
Source Source
File: wp-includes/functions.php
function date_i18n( $dateformatstring, $timestamp_with_offset = false, $gmt = false ) { global $wp_locale; $i = $timestamp_with_offset; if ( false === $i ) { $i = current_time( 'timestamp', $gmt ); } /* * Store original value for language with untypical grammars. * See https://core.trac.wordpress.org/ticket/9396 */ $req_format = $dateformatstring; $dateformatstring = preg_replace( '/(?<!\\\\)c/', DATE_W3C, $dateformatstring ); $dateformatstring = preg_replace( '/(?<!\\\\)r/', DATE_RFC2822, $dateformatstring ); if ( ( ! empty( $wp_locale->month ) ) && ( ! empty( $wp_locale->weekday ) ) ) { $datemonth = $wp_locale->get_month( date( 'm', $i ) ); $datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth ); $dateweekday = $wp_locale->get_weekday( date( 'w', $i ) ); $dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday ); $datemeridiem = $wp_locale->get_meridiem( date( 'a', $i ) ); $datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) ); $dateformatstring = ' ' . $dateformatstring; $dateformatstring = preg_replace( '/([^\\\])D/', "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring ); $dateformatstring = preg_replace( '/([^\\\])F/', "\\1" . backslashit( $datemonth ), $dateformatstring ); $dateformatstring = preg_replace( '/([^\\\])l/', "\\1" . backslashit( $dateweekday ), $dateformatstring ); $dateformatstring = preg_replace( '/([^\\\])M/', "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring ); $dateformatstring = preg_replace( '/([^\\\])a/', "\\1" . backslashit( $datemeridiem ), $dateformatstring ); $dateformatstring = preg_replace( '/([^\\\])A/', "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring ); $dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) - 1 ); } $timezone_formats = array( 'P', 'I', 'O', 'T', 'Z', 'e' ); $timezone_formats_re = implode( '|', $timezone_formats ); if ( preg_match( "/$timezone_formats_re/", $dateformatstring ) ) { $timezone_string = get_option( 'timezone_string' ); if ( false === $timestamp_with_offset && $gmt ) { $timezone_string = 'UTC'; } if ( $timezone_string ) { $timezone_object = timezone_open( $timezone_string ); $date_object = date_create( null, $timezone_object ); foreach ( $timezone_formats as $timezone_format ) { if ( false !== strpos( $dateformatstring, $timezone_format ) ) { $formatted = date_format( $date_object, $timezone_format ); $dateformatstring = ' ' . $dateformatstring; $dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring ); $dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) - 1 ); } } } else { $offset = get_option( 'gmt_offset' ); foreach ( $timezone_formats as $timezone_format ) { if ( 'I' === $timezone_format ) { continue; } if ( false !== strpos( $dateformatstring, $timezone_format ) ) { if ( 'Z' === $timezone_format ) { $formatted = (string) ( $offset * HOUR_IN_SECONDS ); } else { $prefix = ''; $hours = (int) $offset; $separator = ''; $minutes = abs( ( $offset - $hours ) * 60 ); if ( 'T' === $timezone_format ) { $prefix = 'GMT'; } elseif ( 'e' === $timezone_format || 'P' === $timezone_format ) { $separator = ':'; } $formatted = sprintf( '%s%+03d%s%02d', $prefix, $hours, $separator, $minutes ); } $dateformatstring = ' ' . $dateformatstring; $dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring ); $dateformatstring = substr( $dateformatstring, 1 ); } } } } $j = @date( $dateformatstring, $i ); /** * Filters the date formatted based on the locale. * * @since 2.8.0 * * @param string $j Formatted date string. * @param string $req_format Format to display the date. * @param int $i A sum of Unix timestamp and timezone offset in seconds. * @param bool $gmt Whether to use GMT timezone. Only applies if timestamp was * not provided. Default false. */ $j = apply_filters( 'date_i18n', $j, $req_format, $i, $gmt ); return $j; }
Expand full source code Collapse full source code View on Trac
Changelog Changelog
Version | Description |
---|---|
0.71 | Introduced. |
User Contributed Notes User Contributed Notes
You must log in before being able to contribute a note or feedback.
The
date_i18n()
function basically behaves exactly like the normal PHPdate()
function, except that it also translates things like month names and weekdays and similar into the current locale for the site. You can replace a call todate()
with a call todate_i18n()
, using the same arguments thatdate()
normally takes.The
date_i18n()
function also takes an additional argument, which should be used only if you’re specifying GMT (UTC) time and not a local time.The core of WordPress includes the necessary pieces to translate months and days and so forth in the core code, so this function is one translation function which does not need a text-domain when used in plugins and themes. The translations will always be included in the core language packs.
Note that the “format”, however, is not converted to a local one if you manually specify it. If you need a localized format, then you should use
get_option('date_format')
if you need the format set by the user in Settings->General, and thus one of their choosing. Alternatively, you can wrap your predefined format in__()
in order to allow translators to adjust the date to the proper local format. If you do so, then you should also include a translator comment, to let the translators know what the date format is referring to and where it is used, so they can convert it accurately.Feedback
If you need to use the genitive case of a month in Greek you can use (WHILE formatted for GREEK in General Settings page):
The above returns:
Πέμπτη, 29 Νοεμβρίου 2018
Instead of:Which returns:
Πέμπτη, 29 Νοέμβριος 2018
— By timon33 —Depending on your blog settings you will see the date displayed in your local format, for example: 15. november 1976.
It is important to note that
date_i18n()
:date()
, not all formats are supported (such as shorthands);$gmt
argument under normal circumstances;Any use of this function must be carefully audited for correctness, especially in regards to output of time zones.
To get both the date and time within a single string, use
date_i18n
twice with a separator. At the same time, you can also retrieve the local Date and Time formats that are set within the General Settings page.For example, to return: ‘March 3, 2018 @ 7:18 am’ (formatted for the US, Eastern Standard Time in the General Settings page):
Result:
The third argument has no effect if second argument was set.
To display translated date/time based on WP settings (time zone, format). The
$unixtimestamp
argument must be convert from GMT like this.The result will be:
This is based on Thai language, Bangkok time zone.
More examples are on [moderated]