2

次のようなタイムスタンプの日付をフォーマットする小さなスニペットがあります。(YYYY-MM-DD H:M:S T ) Ex: 2011-09-29 17:00:46 EST or 2011-09-29 17:00:46 EDT

ESTとEDTをETに変換し、代わりにETを表示したいので、ユーザーはDayligtの節約について気にしません。それ、どうやったら出来るの?

    $timeZone = new DateTimeZone('America/New_York');
    $processedDate = str_replace(".000000", "", $timestamp);
    $dateTime = new DateTime($processedDate, new DateTimeZone('GMT'));
    $dateTime->setTimezone($timeZone);
    $processedDate = $dateTime->format('Y-m-d H:i:s') . ' ' . $dateTime->format('T');
    echo processedDate;
4

3 に答える 3

9

あなたがやりたいことは実用的ではなく、ユーザーがあなたを嫌うことになります。

名前付きタイムゾーンの背後にある全体的な理由は、現地時間を正確に表すためです。そのローカルエリアがDST内にある場合、「標準」時間をローカル時間として表すことは、客観的に正しくありません。そのタイムゾーン内で時間を読み取る人は、誤った情報を受け取ることになります。

タイムゾーンを無視する日付と時刻を保存して操作する必要がある場合は、その目的でUTCを使用します。つまり、ストレージと通常の計算です。古き良きUnixタイムスタンプでさえ、「1970年1月1日、UTCの午前0時過ぎの秒数」であることを覚えておく価値があります。

ユーザーにとってローカルな時間を表す必要がある場合は、ユーザーがローカルタイムゾーンを選択し、それを表示に変換できるようにする必要があります。最新のPHPのDateTimeとDateTimeZoneは、これを非常にシンプルにします。インタラクティブプロンプトから:

php > $utc = new DateTimeZone('UTC');
php > $amla = new DateTimeZone('America/Los_Angeles');
php >
php > $two_past_midnight = new DateTime('2011-04-05 00:02', $utc);
php > $two_past_midnight->setTimeZone($amla);
php > echo $two_past_midnight->format('Y-m-d H:i:s');
2011-04-04 17:02:00

混乱も大騒ぎもありません。タイムゾーンを切り替えたとき、それは私たちのために数学の面倒を見てくれました。

別の方法として、本当に本当に本当にDSTタイムゾーンをフラットにしたい場合は、getTransitionsとgetOffsetをさまざまなタイムゾーンのdate()形式と組み合わせて見てください。結果の情報を調べて、DSTゾーンの「標準」バージョンが次に移行するタイミングを見つけ、それに応じて調整することができます。異なる領域は異なる時間に遷移し、すべての領域が同じ量だけ遷移するわけではないことを覚えておいてください...そして一部はまったく遷移しません。誰かがすでにインディアナについて言及したと思います。

通常、ここでサンプルコードも提供しますが、日付の計算は、暴力に対する飽くなき渇望で私を満たします。60、60、24、7、4-6、12、52が時間と日付について考えるのに受け入れられる方法であると決定した人は誰でも、邪悪な、邪悪な人々でした。ありがたいことに、彼らはすべて数百年から数千年の間死んでいます。

于 2012-06-15T19:11:22.987 に答える
1

ETという名前のタイムゾーンはありません-またはのいずれEST (Eastern Standard Time)EDT (Eastern Daylight Time)です。夏時間のない東部標準時が必要な場合は、ESTを使用してください。

于 2012-06-15T19:20:21.730 に答える
0
$date = str_replace(array('EST', 'EDT'), 'ET', $date);
于 2021-02-03T22:41:50.257 に答える