4

PHP で dateTime オブジェクト (asp から) を取得する Web サービスがあります。この日付をカスタム形式で解析したい。日付はもともと "2010-07-05T00:00:00+02:00" の形式です。私がこれを試しているとき:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;

1日早い日付「07.04.2010」を取得しています。なんで?

ありがとう

4

3 に答える 3

8

それを見ると、元の日付 ($date_from_webservice) はタイムゾーン GMT+2 で、時刻は午前 0 時です。

PHPが構成されているタイムゾーンが異なると推測しているため(おそらくUTC)、日付は前日に「表示」されます。ただし、変換は完全に正しいです。

これを解決するには、いくつかのオプションがあります。

  1. オリジンサーバーに日時をUTCとして返すように依頼/指示します(これは実際に行うべきことです)。PHPもUTCを使用していることを確認してください。

  2. date_default_timezone_setまたは php.iniを使用して、ソース サーバーと同じタイムゾーンに PHP を構成します。夏時間のため、時間を足したり引いたりすることはできません。

  3. 日時形式が一貫していることが確実な場合は、substr. 例えば:

    $sDate=substr($oDate, 8, 2).'.'.substr($oDate, 5, 2).'.'.substr($oDate, 0 ,4);

オプション 1 が最適です。オリジンサーバーのタイムゾーンが変更されている場合、オプション 2 は危険です。オプション 3 は、日時形式が変更されないことを前提としています。

于 2010-07-05T20:15:15.327 に答える
3

タイムゾーン オフセットが +2 時間未満であるためです。現在のタイムゾーン オフセットが UTC + 1 時間であるリスボンにいるとします。すると、その時刻は「2010-07-04T23:00:00+01:00」となり、1 日前になります。

代わりに使用できますDateTime

$date = new DateTime("2010-07-05T00:00:00+02:00");
echo $date->format("d.m.Y"); //echoes 05.07.2010

これにより、タイムゾーン「+02:00」が日付に自動的に関連付けられ、フォーマットが正しいことが保証されます。

一方で:

$date = new DateTime("2010-07-05T00:00:00+02:00");
$date->setTimeZone(new DateTimezone("Europe/Lisbon"));
echo $date->format("d.m.Y"); //echoes 04.07.2010
于 2010-07-05T20:15:11.423 に答える
1

PHP は、文字列をフォーマットするときに (悪意のある) グローバル タイムゾーンを使用しdateます。$oDateを呼び出すことで、 のタイムゾーンを使用できますdate_default_timezone_set

$oDate = strtotime($date_from_webservice);

$oldTimezone = date_default_timezone_get();
date_default_timezone_set(date('e', $oDate));

$sDate = date('d.m.Y', $oDate);

date_default_timezone_set($oldTimezone);

echo $sDate;
于 2010-07-05T20:20:10.233 に答える