2017-09-04 9 views
0

私は時間とともにいくつかの魔法をやるレガシーシステムを持っています。タイムゾーンとそのタイムゾーンを知っている時のUTC時間を計算します

私はタイムゾーン(例設定することができます。レガシーシステムのどこかにEurope/Bucharestを管理者がバックエンドのどこかで時間を入力することができますが、が、それは常にUTC時間になります

時間が保存されると、データベースには上記の設定されたタイムゾーンが考慮されますので、管理者が10 PMと言っても、データベースの時刻は7 PMになります(それはちょっと愚かです)。私がやっているデータベースからの直接の時間は、管理者が実際に入力した時間ではなく、タイムゾーンに調整されます。

Long story short:タイムゾーンとそのタイムゾーンを知っていれば、正しいUTC時間をどのように計算できますか?例:午後7時から午後10時の間、時間帯がEurope/Bucharestであることがわかったとき。私は非ハックな方法でこれをやりたい(誰が私を追加したり、修正したい場合は、本当に、行ってください)...

を私は推測する自分の質問に答えるために

答えて

2

私の理解では、あなたのシステムが(システムが潜在的に異なるタイムゾーンからのユーザーがアクセスする必要がある場合には良いアイデアです)UTCとして日付を格納しています。また、管理者が日付を入力すると、DBに保存する前にUTCに変換されていることも理解しています(これはかなり賢明なアプローチです)。そして今、あなたはデータベースから読み込まれ、現地時間で日付を提示できるようにする必要があります。

$database_time = '2017-09-02T21:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('UTC')); 
$your_tz = new DateTimeZone('Europe/Warsaw'); 
$date_obj->setTimeZone($your_tz); 
var_dump($date_obj); 

あなたは(DBでUTCとしてローカル時間を節約するか、単にUTCの時刻を表示)反対を行う必要がある場合は、 :

$local_time = '2017-09-02T23:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('Europe/Warsaw')); 
$db_tz = new DateTimeZone('UTC'); 
var_dump($date_obj); 

既知のタイムゾーンでただし、データベースのデータを格納した場合、あなたは単にUTCにその時間を変換する必要があり、それはの問題です:Jarek.Dの答え@

$database_time = '2017-09-02T21:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('Europe/Warsaw')); 
$date_obj->setTimeZone(new DateTimeZone('UTC')); 
echo $date_obj->format('Y-m-d\TH:i:s'); 
+1

'createFromFormat()'の本当の美しさは、すべてを1ライナーにすることです。 'echo DateTime :: createFromFormat( 'Ymd \ TH:i:s'、$ database_time、new DateTimeZone( 'UTC' )) - > setTimezone(new DateTimeZone( 'Europe/Warsaw')) - > format( 'Ymd H:i:s'); ':) – Narf

+0

あなたはコードではなく、理解しています。データベースに格納されている時間は、現在のタイムゾーンにあります(この例では、 'Europe/Bucharest'に追いついています)。 – Andrew

+0

OK、このケースでは私の答えの2番目の例はまだありますが、実際には$ local_timeがUTCに変換しようとしていると仮定する必要があります。 –

0

$database_time = '2017-09-02T21:00:00'; 

$diff = date('Z', strtotime($database_time))/3600; // to get the diff in hours, by default it's in seconds 

$UTC_time = (new DateTime($database_time))->modify("+ $diff hour"); 

$UTC_time->format('m-d-Y H:i:s'); 
+0

は、技術的に優れています。 – Narf

+0

合意し、はるかに良い答え。 – Andrew

関連する問題