strftime给出了错误的月份名称(仅限二月份......)

时间:2014-05-29 16:31:42

标签: php date hebrew strftime setlocale

我有以下代码,以获取特定日期的月份名称,然后使用以希伯来语获取月份名称。

$thismonthname = date("F", mktime(0, 0, 0, $thismonthnumber, 10)); 

date_default_timezone_set('Asia/Tel_Aviv');     // Set timezone to Israel   

$locale = 'he_IL.utf8'; setlocale(LC_ALL, $locale); // Set Locale to Hebrew

$thismonthnameheb = strftime('%B', strtotime($thismonthname));

除2月外,它完美无缺。

当我打印出$ thismonthname时,它会显示“二月”,但是当我打印出$ thismonthnameheb时,它会用希伯来语说“מרץ(march)”。

发疯了,我无法弄清楚这一点。

3 个答案:

答案 0 :(得分:1)

从时间到字符串和返回,你做了太多的转换 不要转换time -> string -> time,只需保留时间值并将结果基于:

$thismonthtime = mktime(0, 0, 0, $thismonthnumber, 10);
$thismonthname = date("F", $thismonthtime); 

date_default_timezone_set('Asia/Tel_Aviv');     // Set timezone to Israel   
$locale = 'he_IL.utf8'; setlocale(LC_ALL, $locale); // Set Locale to Hebrew

$thismonthnameheb = strftime('%B', $thismonthtime);

答案 1 :(得分:0)

注意顺序:

php > $time = mktime(0,0,0,2, 10);
php > echo date('r', $time);
Mon, 10 Feb 2014 00:00:00 -0600  // everything ok here, I'm in UTC-6
php > date_default_timezone_set('Asia/Tel_Aviv');
php > echo date('r', $time);
Mon, 10 Feb 2014 08:00:00 +0200  // note how it's now 8 hours "later"
php > $month =  date('F', $time);
php > echo $month;
February
php > $newtime = strtotime($month);
php > echo date('r', $newtime);
Sat, 01 Mar 2014 00:00:00 +0200  // hey! it's march again!

你把日期剥离到一个简单的月份名称,然后期望PHP神奇地能够猜出你期望做什么。如果您只喂一个月,它可以随意选择年/日/时间值。

答案 2 :(得分:0)

这与希伯来语无关,因为,至少在我使用的特定版本的PHP(5.3.10)上,

echo strftime('%d %B', strtotime('February'));

给出

01 March

正如评论中所建议的那样,这种可以说是出乎意料的行为基本上是由于PHP的假设给定月份的日期是30日,除非用户实际指定了不同的值 。因此,二月我们会溢出到三月一日。

查看this reference可能会有用。