1

背景: ユーザーが todo を作成できるシステムがあります。現在、cron ジョブは 12 時間ごとに開始され、リマインダー メールが送信されます。問題?すべてのユーザーが同じタイムゾーンにいるわけではないため、私の午前 7 時が午前 1 時になることがあります。

目的: ユーザーが自分のタイムゾーンを選択できるようにします。また、ユーザーが 15 分刻みで自分の好みの時間を選択できるようにします (時間と 00、15、30、または 45 を選択します)。

私が得たもの:電子メールサーバーのタイムゾーン(-0600)と一致するように、Webアプリに変数を設定しました。ユーザーが自分のタイムゾーンと 2 つの優先メール時間を送信できるようにしました。現在の時刻がユーザーの希望する送信時刻と一致するかどうか、およびユーザーのタイムゾーンがシステムのタイムゾーンと一致するかどうかを確認するスクリプトを作成中です。

背景、パート II: ユーザーが自分のタイムゾーンを送信すると、その時点で 2 つの希望する時間を選択します (これら 3 つの情報はすべて、データベース内の自分のセルに入力されます)。

私が立ち往生している場所: ユーザーが送信するときに優先時間 ($etime1 と $etime2) をシステムのタイムゾーン ($systz) に変換するのが最善の方法だと思うので、システムのタイムゾーンとしてデータベースに保存されます。このように、計算はユーザーが設定を送信したときに行われ (それほど頻繁ではありません)、cron ジョブが実行されるたびに (非常に頻繁に - 15 分ごとに) 行われるわけではありません。ユーザーのタイムゾーンは、変数 $uzertz の下にあります。

つまり: ユーザーがデータを送信すると、これが得られたものです」

if ($usertz == $systz) {
*submit the $etime1 and $etime2 data as-is*}
else { *run some sort of script to convert $etime1 and $etime2 to the -0600
(system's timezone) equivalent, after which is should be submitted to the db in it's
converted version* } 

PHP が時間をあるタイムゾーンから別のタイムゾーンに変換する方法を提供していることは理解していますが、これらのスクリプトがどのように機能するかを理解するのに苦労しています。

ありがとう!

4

2 に答える 2

2

サーバーでは、常にGMTを使用する必要があります。これは、一貫した時間測定を行う唯一の方法です。たとえば、夏時間の場合などです。ちなみに、時間を他のタイムゾーンに変換するには、DateTimeを使用できます

<?php
$date = new DateTime($etime1, new DateTimeZone($usertz));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone($systz));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>

関数DateTimeZone::listIdentifiers()を使用して、使用可能なすべてのタイムゾーンのリストを見つけることができます。

例:

<?php
  // Server date/time
  $etime1 = '2012-11-22 08:00:00'; 
  // Server timeZone
  $date = new DateTime($etime1, new DateTimeZone('Asia/Jerusalem'));

  // Converted date/time
  $date->setTimezone(new DateTimeZone('America/Chicago')); 
  echo $date->format('Y-m-d H:i:sP') . "\n"; 
?>

そして、出力は次のとおりです。

2012-11-22 00:00:00-06:00  
于 2012-11-21T13:02:37.183 に答える
0

DateTimePHP 5 で提供されているオブジェクトを使用できます。

DateTimeZoneこれにより、DateTime を作成するときにオブジェクトを提供できます。

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));

タイムゾーンを動的に変更することもできます。

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
于 2012-11-21T13:04:15.273 に答える