strftime错误的日期

时间:2013-03-27 22:29:17

标签: php date strftime

我正在使用strftime来显示未来日期。

但是在使用

strftime('%a., %d. %B %Y',time()+60*60*24*4)

2013年4月1日,我正在接受Mo.,而不是2013年3月31日的Su。今天使用它。

(Unix时间戳为1364423120)

strftime('%a., %d. %B %Y',time()+60*60*24*3)

显示正确的Sa.,2013年3月30日

三月最后一天有什么问题?

5 个答案:

答案 0 :(得分:5)

时间戳代表当地时间23:25:20。由于夏令时在3月31日生效,增加96小时将以当地时间00:25:20为准,因此比预期晚一天。使用gmstrftime而不是strftime可以避免这个问题。

<?php

$timestamp = 1364423120;

echo strftime('%a., %d. %B %Y (%c %Z)', $timestamp)."\n";
echo strftime('%a., %d. %B %Y (%c %Z)', $timestamp +60*60*24*4)."\n";
echo gmstrftime('%a., %d. %B %Y (%c %Z)', $timestamp)."\n";
echo gmstrftime('%a., %d. %B %Y (%c %Z)', $timestamp +60*60*24*4)."\n";

给出

Wed., 27. March 2013 (Wed Mar 27 23:25:20 2013 CET)
Mon., 01. April 2013 (Mon Apr  1 00:25:20 2013 CEST)
Wed., 27. March 2013 (Wed Mar 27 22:25:20 2013 GMT)
Sun., 31. March 2013 (Sun Mar 31 22:25:20 2013 GMT)

答案 1 :(得分:1)

检查你的时区。

使用以下代码查看代码生成日期的时间,时间戳和时区。

echo strftime('%s %H:%M:%S %z %Z %a., %d. %B %Y',time()+60*60*24*4);
//Output: 1364769859 15:44:19 -0700 PDT Sun., 31. March 2013

编辑:

如果您所在地区的DST确实存在问题[几周前北美的变化],并且您只对该日期的“日期”部分感兴趣,那么我建议您使用date_add()而不是简单的算术,因为它将考虑DST的变化,以及其他计时的特殊性。

答案 2 :(得分:1)

根据手册

  

strftime - 根据区域设置格式化本地时间/日期

如果您在使用区域设置时指定区域设置会更好,以避免此类问题。

setlocale(LC_TIME, "de_DE");
strftime('%a., %d. %B %Y',time()+60*60*24*4)

答案 3 :(得分:1)

我跑的时候

echo strftime('%a., %d. %B %Y',time()+60*60*12*7)

我得到了

Sun., 31. March 2013

所以这一天真的存在:)我认为这与当天发生的夏令时变化有关。当你使用一整天(24小时相乘)时,你正在跳过时区变化。

答案 4 :(得分:0)

Terje D.正确地提到了您在使用DST时遇到的困惑。 但是我也想提一个使用DateTime的方法,我个人认为这更容易理解和使用

$dt = new DateTime('now', new DateTimeZone('UTC')); // creates a datetime object representing the current time in UTC
$dt->modify('+3 days'); // add 3 days to the datetime object
echo $dt->format('Y-m-d H:i:s')."\n"; // This will give you the time in english independent of the locale settings on your server
echo strftime('%a., %d. %B %Y', $dt->getTimeStamp()); // this will give you the time in your locale, which as mentioned before, will include DST