根据PHP中的语言环境获取日期格式

问题描述:

有一个非常简单的问题。我有一个区域标识符en,en_US,cs_CZ或其他。我只需要获取该语言环境的日期时间格式。我知道我可以根据语言环境轻松地设置任何时间戳或日期对象的格式。但我只需要日期格式的字符串表示形式,比如说一个正则表达式。有没有管理这个功能的功能?我还没有发现任何到目前为止...根据PHP中的语言环境获取日期格式

Exapmle:

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

我同意@dagon。并设置PHP以遵循UTC将使它更容易。 – ThinkingMonkey 2012-01-11 22:27:02

+1

@Dagon我相信你的评论更准确,你应该把它作为答案。 – 2012-01-11 22:40:02

从注释转换:

你将不得不与建设的可能性列表的数组。

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

发布功能完成某个地方时,我敢肯定它会派上用场,为他人

+0

这是建议,但不是答案 – verybadbug 2017-01-21 13:18:48

+0

我被要求回答评论,所以我做了。 – 2017-02-05 06:24:38

使用strftime()连同setlocale()。看起来就像你在找什么。

+0

感谢您的回答,但方式正好相反。如果不是,我不遵循你的想法。你能写一个简短的例子吗? – 2012-01-11 22:30:05

+2

啊,我想我现在明白了。 'strftime()'会转换输出的时间和语言,但是对于加拿大的“yyyy-mm-dd”这样的实际格式,阿尔巴尼亚的“dd/mm/yyyy”相对而言,我相信你将不得不使用Dagon做法。似乎应该有一个功能,这样做...... – 2012-01-11 22:39:21

我试图做同样的事情自己。而不是建立一个所有国家的数组,如何使用正则表达式来确定格式?

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

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

+0

请注意,该日期格式将以ICU格式 – verybadbug 2017-01-21 13:41:01

+0

对我来说,这是最好的答案 - 通用,简短和工作。尽管这些ICU格式在可能性上似乎很短。我需要像IntlDateFormatter :: SHORT这样的4位数字和前导0。 – userfuser 2017-05-20 23:24:35

+0

我没有从手册中选择它(它说''中等风格(1952年1月12日)“'),但显然IntlDateFormatter :: MEDIUM正是我所需要的(前导零,5位数年份) – userfuser 2017-05-21 06:19:38