strftime与locale奇怪的行为

时间:2013-08-06 12:49:23

标签: php date locale

在项目中,我想根据用户区域设置显示日期 日期存储在mysql表中,作为unix时间戳 为了让我在特定的语言环境中显示日期,我有以下代码:

// in my config file:
// $setLocale is from database (examples: en_EN.UTF8 or fr_FR.UTF8 or it_IT.UTF8 etc)
setlocale(LC_ALL, $setLocale); 

//in my function file
function my_mb_ucfirst($str, $e='utf-8') 
{
    $fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);

return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
}

//and in any php page i want to show dates:
$dateFromDb = 1419980400; // example value from table
$date = my_mb_ucfirst(strftime("%b %d, %G", $dateFromDb));

现在奇怪的部分:
上述日期1419980400给出了两个不同的结果。

echo my_mb_ucfirst(strftime("%b %d, %G", 1419980400)); 

这给出 2015年12月31日

echo date("M d, Y", 1419980400); 

这给了 2014年12月31日

任何人都可以向我解释为什么会这样吗?
上述过程中是否有任何错误?

注意:此错误/错误我使用三种不同的配置验证了它:
apache 1.3 + php 4.3
apache 2.0 + php 5.3
windows xp + xampp 1.7.4

1 个答案:

答案 0 :(得分:5)

在德语http://php.net/manual/de/function.strftime.php版本中写有:

  

%G ... Besonderheit:entspricht死于ISO Wochennummer dem vorhergehenden oder folgenden Jahr,wird dieses Jahr verwendet。

意思是:它寻找一周没有。如果一周属于那个年份,则需要上一年或下一年。

所以只需采用%Y代替%G

编辑:

英文版http://php.net/manual/en/function.strftime.php告诉我们:

%G%g的完整四位数版本

%g符合ISO-8601:1988标准的年份的两位数字表示(见%V)

%V ISO-8601:1988年给定年份的周数,从一年的第一周开始         至少4个工作日,周一是本周的开始