在PHP中根据区域设置获取日期格式。

14

有一个非常简单的问题。我有一个语言环境标识符,如en、en_US、cs_CZ等等。我只需要获取该语言环境下的日期时间格式。我知道可以根据语言环境轻松地格式化任何时间戳或日期对象。但是我只需要日期格式的字符串表示,比如正则表达式。是否有任何函数来处理这个功能?到目前为止我还没有找到...

示例:

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

我同意@dagon的观点。将PHP设置为遵循UTC将使其更加容易。 - ThinkingMonkey
1
@Dagon,我认为你的评论更准确,你应该把它作为答案。 - Matt K
4个回答

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

    return $formatter->getPattern();
}

确保你安装了intl扩展。


对我来说,这是最好的答案 - 通用、简短且有效。尽管那些 ICU 格式似乎在可能性方面相当有限。我需要像 IntlDateFormatter::SHORT 这样的东西,带有 4 位数字年份和前导 0。 - userfuser
我没能立刻从手册上发现(它写着“中等风格(1952年1月12日)”),但显然 IntlDateFormatter::MEDIUM 就是我需要的(前导零,5位数字年)。 - userfuser
这对我来说是正确的答案,在这个时代。现代API,不需要使用setlocale() - glasz

3

这是建议,而不是答案。 - verybadbug
我被要求将评论转换为答案,所以我这样做了。 - user557846

2

我也在尝试做同样的事情。不要建立所有国家的数组,使用正则表达式来确定格式如何?

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()));
}

2
几年后:像上面一样设置区域设置,只需跳过getDateFormat函数并使用strftime(“%x”,$ timestamp) - Kjell
$likes += 1; //恰好及时。 ;) - juan.benavides

0

谢谢你的回答,但那是相反的方式。如果可以的话,你能否写一个简短的例子呢?如果不行,我就不太明白你的想法了。 - Pavel S.
2
啊,我现在明白了。strftime()将转换时间和输出语言,但对于实际格式(例如在加拿大的“yyyy-mm-dd”与阿尔巴尼亚的“dd/mm/yyyy”),我认为您将不得不使用Dagon的方法。看起来应该有一个可以做到这一点的函数... - Matt K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接