6

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

但是在使用的时候

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

今天使用这个时,我得到的是 Mo., 0​​1. April 2013 而不是 Su., 31. March 2013。

(Unix 时间戳为 1364423120)

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

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

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

4

5 回答 5

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)
于 2013-03-27T22:52:10.863 回答
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 的变化和计时的其他特性。

于 2013-03-27T22:44:48.887 回答
1

根据说明书

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

如果您在使用它时指定一个语言环境,它会更好,以避免此类问题。

setlocale(LC_TIME, "de_DE");
strftime('%a., %d. %B %Y',time()+60*60*24*4)
于 2013-03-27T22:51:55.763 回答
1

当我跑

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

我有

Sun., 31. March 2013

所以这一天确实存在:) 我认为它与那天发生的夏令时变化有关。当您使用一整天(24 小时相乘)时,您将跳过时区更改。

于 2013-03-27T22:52:07.073 回答
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
于 2015-09-24T15:24:56.623 回答