2

スケジュール情報を ISO8601 形式で返す JSON イベント API に接続しています。

"schedule": [
{
    "datetime": "2014-06-02T19:30:00-04:00",
    "speaker": "Keith Moore"
},
{
    "datetime": "2014-06-03T19:30:00-04:00",
    "speaker": "Phyllis Moore"
]

echo date("c", strtotime($schedule[$j]["datetime"]));2014-06-02T18:30:00-05:00 になったとき。もちろん、date()サーバーのタイムゾーンを使用するため、これは理にかなっています。

にタイムゾーンを渡すdate()か、またはdate_default_timezone_set) を使用すると、問題が解決するはずです。残念ながら、ISO8610 のタイム ゾーンに関する仕様はありません (オフセットのみ)。を使用して ISO8601 の日付からタイム ゾーンを取得しようとすると、タイムdate()ゾーンはサーバーのものに戻ります。

私がやりたいのは、イベントのローカルな日付/時間/タイム ゾーン (この例では東部夏時間) を表示することです。これを行う方法はありますか?

私が考えたいくつかのオプションですが、どちらも適切ではないようです...

API を制御できるので、スケジュール情報を RFC 822 形式で送信できます (Mon, 02 Jun 2014 19:30:00 EDT)。それは私ができるフックを私に与えるでしょう...

if ($pubDatetimezone == "PST" || $pubDatetimezone == "PDT") date_default_timezone_set("America/Los_Angeles");
if ($pubDatetimezone == "MST" || $pubDatetimezone == "MDT") date_default_timezone_set("America/Denver");
if ($pubDatetimezone == "CST" || $pubDatetimezone == "CDT") date_default_timezone_set("America/Chicago");
if ($pubDatetimezone == "EST" || $pubDatetimezone == "EDT") date_default_timezone_set("America/Montreal");

...しかし、ISO8601 の方が適切な形式のようです。

一方で、可能なすべての日付/オフセットの組み合わせとタイム ゾーンを指定する、非常に複雑な配列を作成することもできます。それは間違いなく、やりすぎのようです。

4

2 に答える 2

5

PHP の DateTime を使用する必要があります。ISO8601 は国際標準であるため、PHP はそれをサポートしています。必要なコードは次のとおりです。

$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00');

3 番目のパラメーターである DateTimeZone オブジェクトを指定して、指定された日付をさらにオフセットすることができます。

たとえば、GMT -4 を GMT として使用したい場合

$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00', new DateTimeZone('Europe/London'));

そしてその後、残っているのは次のとおりです。

echo $dt->format('d.m.Y, H:i:s'); // format is the same as for date() function.
于 2013-07-30T15:35:42.253 に答える
-1

与えられた回答は、適切で非常に役に立ちましたが、説明されていない例外が多すぎました (オフセットが同じであっても、間違ったタイムゾーンの省略形を出力しています)。

私は API を制御できるので、タイム ゾーン フィールドを含めただけです。

"schedule": [
{
    "datetime": "2013-08-02T18:30:00-05:00",
    "timezone": "CDT",
    "speaker": "Happy Caldwell"
}
]

次に、そのデータを使用するときに、単純に比較を行い、サーバーをそのタイム ゾーンに設定しました。

if ($timezone == "HAST" || $timezone == "HADT") date_default_timezone_set("Pacific/Honolulu");
if ($timezone == "AKST" || $timezone == "AKDT") date_default_timezone_set("America/Juneau");
if ($timezone == "PST" || $timezone == "PDT") date_default_timezone_set("America/Los_Angeles");
if ($timezone == "MST" || $timezone == "MDT") date_default_timezone_set("America/Boise");
// doesn't observe dst
if ($state == "AZ") date_default_timezone_set("America/Phoenix");
if ($timezone == "CST" || $timezone == "CDT") date_default_timezone_set("America/Chicago");
if ($timezone == "EST" || $timezone == "EDT") date_default_timezone_set("America/New_York");
// doesn't observe dst
if ($timezone == "PET") date_default_timezone_set("America/Lima");
if ($timezone == "AST" || $timezone == "ADT") date_default_timezone_set("America/Puerto_Rico");
// doesn't observe dst
if ($timezone == "GMT") date_default_timezone_set("Europe/London");
if ($timezone == "CET" || $timezone == "CEST") date_default_timezone_set("Europe/Amsterdam");
// doesn't observe dst
if ($timezone == "WAT") date_default_timezone_set("Africa/Lagos");

今、これを行うためのより良い方法があると確信しています(おそらく を使用DateTime)。同じ機能を実行するためのより良い方法について、自由にコメントしてください。ただし、これは必要なことを行います。

もちろん、これはタイムゾーンのオフセットしか持っていない人には役に立ちません。そのような場合、他の回答のいずれかを使用して、例外に対処する必要がある場合があります。

于 2013-07-31T16:27:25.510 に答える