6

strftime を使用して将来の日付を表示しています。

でも使ってるうちに

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

今日これを使用している間、2013 年 3 月 31 日ではなく 2013 年 4 月 1 日を取得しています。

(Unix タイムスタンプは 1364423120 です)

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

正しい Sa., 30. March 2013 を表示します

3 月の最後の日で何が問題なのですか?

4

5 に答える 5

5

タイムスタンプは、現地時間の 23:25:20 を表します。夏時間は 3 月 31 日に実施されるため、96 時間を追加すると現地時間として 00:25:20 が得られ、予想より 1 日遅い日付になります。strftime の代わりに gmstrftime を使用すると、この問題を回避できます。

<?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

だからこの日は本当に存在します:)それはその日に起こるサマータイムの変更に関連していると思います。また、1 日 (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 に答える