【问题标题】:Get date format according to the locale in PHP根据PHP中的语言环境获取日期格式
【发布时间】:2012-01-11 22:17:34
【问题描述】:

有一个非常简单的问题。我有一个语言环境标识符,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 会更容易。
  • @Dagon 我相信你的评论更准确,你应该把它作为答案。

标签: php datetime date format


【解决方案1】:
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 的东西。
  • 我没有立即从手册中找到它(上面写着"Medium style (Jan 12, 1952)"),但显然 IntlDateFormatter::MEDIUM 正是我所需要的(前导零,5 位数年份)
  • 在这个时代,这对我来说是正确的答案。现代 api,不要乱搞setlocale()
【解决方案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()));
}

【讨论】:

  • 几年后:像上面一样设置语言环境,跳过getDateFormat函数并使用strftime("%x", $timestamp)
  • $likes += 1; //及时。 ;)
【解决方案3】:

从评论转换:

您必须构建一个包含可能性列表的数组。

http://en.wikipedia.org/wiki/Date_format_by_country 应该会有所帮助。

完成后将函数发布到某个地方,我相信它会对其他人派上用场

【讨论】:

  • 这是建议,但不是答案
  • 我被要求提交评论以回答,所以我做到了。
【解决方案4】:

strftime()setlocale() 结合使用。看起来这就是你要找的东西。

【讨论】:

  • 感谢您的回答,但情况恰恰相反。如果不是,我不遵循你的想法。请你写一个简短的例子好吗?
  • 啊,我想我现在明白了。 strftime() 将转换输出的时间和语言,但对于加拿大的“yyyy-mm-dd”等实际格式,而不是阿尔巴尼亚的“dd/mm/yyyy”,我相信你将不得不使用 Dagon 的方法。似乎应该有一个功能可以做到这一点......
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多