【问题标题】:php mktime gives different results for same date?php mktime 在同一日期给出不同的结果?
【发布时间】:2012-08-30 09:47:42
【问题描述】:

以下代码:

    // settings 1st alternative
    $season = 2011;
    $startweek = 36;

    // calculation, 1st alternative
    // in any case Jan 1st is in 1. week
    $firstweekuniversal = mktime(0,0,0,1,4,$season);
    // I'd like to calculate monday 0:00 of the given week.
    // date(...) computes to monday of the calculated week.
    $startday1 = $firstweekuniversal + 86400 * (7*($startweek-1) - date('w', $firstweekuniversal)+1);

    // settings 2nd alternative
    $StartingDate = "KW36 - 5.09.2011 (Mo)";

    // calculation, 2nd alternative
    $firstparts = explode(" ", $StartingDate);
    $secparts = explode(".", $firstparts[2]);
    $startday2 = mktime(0,0,0,intval($secparts[1]),intval($secparts[0]),intval($secparts[2]));

    // Output
    echo "Start: \$startday1=".$startday1.", Timestamp=\"".date("d.m.Y - H:i:s", $startday1)."\"<br>\n";
    echo "Start: \$startday2=".$startday2.", Timestamp=\"".date("d.m.Y - H:i:s", $startday2)."\"<br>\n";

导致这个输出:

Start: $startday1=1315177200, Timestamp="05.09.2011 - 01:00:00"
Start: $startday2=1315173600, Timestamp="05.09.2011 - 00:00:00"

1h 的差异来自哪里?不可能是夏季问题,在那种情况下,1h 必须反过来,还是我错了? 没有区别,当我尝试使用我的环境(本地主机)时,但在我的 prvider 的服务器上有。

谁能给我解释一下?我在这里完全感到困惑。 提前致谢,

【问题讨论】:

  • 你的本地主机和服务器在哪个时区?
  • 时区都是欧洲/柏林,但这不应该是无关紧要的,因为脚本会同时运行这两种选择吗?
  • 您在本地主机和提供程序上运行什么操作系统?我在我的 Ubuntu VM 上运行它并得到了与您观察到的相同的行为,在 Ubuntu EC2 实例上也是如此。它可能与一些奇怪的 DST 设置有关,但找不到它在哪里/在哪里。
  • 您是否使用同一日期在本地和您的提供商机器上进行测试?因为如果您使用位于 DST 更改之前的较早日期(即:2011 年第 10 周) - 3 月底 - ,您会发现没有区别。我假设因为您手动计算了第一周和 D-Date 之间的时间差,所以如果间隔与 DST 更改相交,您可能需要补偿 DST。

标签: php mktime


【解决方案1】:

我对夏令时的理解是,在冬季和夏季之间的某个时间点,太阳开始升得更早,所以早上 8 点感觉应该是早上 9 点……而这正是时钟的作用,它移动转发使其稍后(通常为一小时)。这也是为什么在学校迟到是一个很好的借口:)

无论如何,您本地 php 的时区设置可能是 UTC(或其他一些“中性”时区),但服务器时区设置尊重夏令时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多