Pavel S.
Pavel S.

Reputation: 12322

Get date format according to the locale in PHP

There is a very simple problem. I have a locale identifier, en, en_US, cs_CZ or whatever. I just need to get the date-time format for that locale. I know I can easily format any timestamp or date object according to the locale. But I need just the string representation of the date format, let's say a regular expression. Is there any function managing this functionality? I haven't found any so far...

Exapmle:

$locale = "en_US";
$format = the_function_i_need($locale);
echo $format; // prints something like "month/day/year, hour:minute"

Upvotes: 15

Views: 39259

Answers (4)

verybadbug
verybadbug

Reputation: 929

function getDateFormat($locale)
{
    $formatter = new IntlDateFormatter($locale, IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
    if ($formatter === null)
        throw new InvalidConfigException(intl_get_error_message());

    return $formatter->getPattern();
}

Make shure you install intl.

Upvotes: 12

CrEOF
CrEOF

Reputation: 131

I'm trying to do the same thing myself. Instead of building an array of all the countries, how about using regex to determine the format?

setlocale(LC_TIME, "us_US");

// returns 'mdy'
$type1 = getDateFormat();

setlocale(LC_TIME, "fi_FI");

// returns 'dmy'
$type2 = getDateFormat();

setlocale(LC_TIME, "hu_HU");

// returns 'ymd'
$type3 = getDateFormat();

/**
 * @return string
 */
function getDateFormat()
{
    $patterns = array(
        '/11\D21\D(1999|99)/',
        '/21\D11\D(1999|99)/',
        '/(1999|99)\D11\D21/',
    );
    $replacements = array('mdy', 'dmy', 'ymd');

    $date = new \DateTime();
    $date->setDate(1999, 11, 21);

    return preg_replace($patterns, $replacements, strftime('%x', $date->getTimestamp()));
}

Upvotes: 2

user557846
user557846

Reputation:

converted from comment:

you will have to build an array with a list of the possibilities.

http://en.wikipedia.org/wiki/Date_format_by_country should help.

post the function somewhere when done, i'm sure it would come in handy for others

Upvotes: 3

Matt K
Matt K

Reputation: 6709

Use strftime() in conjunction with setlocale(). Seems like it's what you're looking for.

Upvotes: 0

Related Questions