2016-05-01 20 views
0

シンプルなPHPグラフ作成スクリプトでは、現地時間の日に時刻の値を揃える必要があります。 $timestamp % 86400 == 0のようなことをすると、毎日午前2時に休憩します。なぜなら、私はここでUTC +2にいるからです。また、すべての私のグリッド線ではなく0am、午前3時、午前6時などの午前2時、午前5時、午前8時などであるUNIXタイムスタンプを現地時間(整数)に変換する

私はUNIXタイムスタンプ整数値はUTCで常にをしていることとdate()gmdate()など、があることを理解するが、私はそれに算術演算を行うために現地時間で整数が必要です。 PHPでどうやったらいいですか? .NETのようなToLocalTime()ToUniversalTime()のような関数はありますか?

質問を明確にするために、私は時間の読みやすい書式設定とは関係ありません。いいえYYYY-MM-DD HH:MM:SSなど、私は数字を扱います。入力は、エポック(UTC)の秒数(UNIXのタイムスタンプ)です。私が必要とするのは同じ種類のものですが、UTCではなく現地時間です。ですから、UNIXのタイムスタンプ整数をローカルのタイムスタンプ整数に変換する必要があります。これが理解できると誰もがこれが使用されることが想像できることを望む(地方時の時間軸グラフのグリッド線を整列させる)。

+0

**このような計算はタイムスタンプでは行いません。 ['DateTime'](http://php.net/manual/ja/class.datetime.php)クラスとその親戚を使用してください。 – axiac

+0

タイムスタンプはUTCだがローカルサーバー時間ではないと思うのはなぜですか? – splash58

+0

@axiac次に、開始時間を3時間に揃える方法を提案しますか?モジュロは簡単です。 DateTimeクラスでこれを行うことはできますか? – ygoe

答えて

0

は、私はオフセット現地時間のUTCを決定するために、これを使用して終了しました次に、その値をタイムスタンプに追加または減算し、UTC時間のように扱いますが、実際にはローカルタイムです。技術的には、私が作業しようとしているリアルタイムでは常にオフになっていますが、そのシフトはUTCと現地時間の差を修正し、「UTCスペース」で現地時間の計算を可能にします。私が終わったら、時間を "ローカルスペース"に戻して表示することができます。また、gmdate関数を使用してローカル時刻形式を取得することもできます。

$now = time() + $tzoffset; 
echo gmdate('...', $now); // Prints local time 
if ($now % 86400 == 0 && gmdate('w', $now) == 1) 
{ 
    echo 'Monday midnight local time'; 
} 
2

datetime classを使用してdate_default_timezone_set

date_default_timezone_set('Europe/Lisbon'); 
$date = new DateTime(); 
echo $date->getTimestamp(); 

あなたのコメントに基づいて更新設定:私は「今」ではないタイムスタンプを持っているし、DSTを適用する必要が

をオフセット です。

PHPはDSTを処理します。必要な変換ルールは、PHPインストールの一部です。


注:

のUNIXタイムスタンプがタイムゾーンの設定の影響を受けません。タイムゾーンを設定すると、タイムスタンプ値の解釈にのみ影響します。

+0

うわー、あなたは 'getTimestamp'メソッドをどうやって見つけましたか?それは文書化されていませんが、とにかくそれが必要です。それ以外は、私が必要とするものではありません。私は "今"ではないタイムスタンプを持っており、それにDSTオフセットを適用する必要があります。 – ygoe

+0

PHPはDSTを処理します。必要な変換ルールは、PHPのインストールの一部です。 –

+0

まだ役に立たない、ごめんなさい。 – ygoe

1

最善の方法はDateTime APIを使用することです。
ですから、DateTimeZoneをクラスを経由してタイムゾーンを扱うことができ、このような何か:

$timezone = new DateTimeZone('UTC'); 
$UTCDate = DateTime::createFromFormat('Y-m-d H:i','2016-05-01 10:00', $timezone); 

# by your local timezone 
$newDate = $UTCDate->setTimeZone(new DateTimeZone('America/New_York')); 
+0

もう一度、これは現地時間の24時間または3時間に合わせて「丸い」数字を見つけるのにどのように役立ちますか?私はそれの整数を持っている場合、私はモジュロを使用することができます。 – ygoe

+0

@LonelyPixelまあ、今どこに行くか知っています。私はあなたがPHPマニュアルに飛び込むべきだと思います。あなたはすでに釣竿を持っています。 ;) – felipsmartins

0

可能な実装:

// Europe/Bucharest is GMT+2 (GMT+3 during DST) 
$tz = new DateTimeZone('Europe/Bucharest'); 

$now = new DateTime('now', $tz); // now (2016-05-01 14:50:23, local time) 
$dayStart = clone $now; 
$dayStart->setTime(0, 0, 0); // start of today (2016-05-01 00:00:00, local time) 
$dayEnd = clone $now; 
$dayEnd->setTime(23, 59, 59); // end of today (2016-05-01 23:59:59, local time) 

// If you need the timestamps (to compare with MySQL TIMESTAMP columns) 
printf("%d .. %d\n", $dayStart->getTimestamp(), $dayEnd->getTimestamp()); 
// It prints: 1462050000 .. 1462136399 


// If you need the dates in UTC timezone (to compare with MySQL DATETIME columns) 
$tzUTC = new DateTimeZone('UTC'); 
$dayStart->setTimezone($tzUTC); 
$dayEnd->setTimezone($tzUTC); 
printf("%s .. %s\n", $dayStart->format('Y-m-d H:i:s'), $dayEnd->format('Y-m-d H:i:s')); 
// It prints: 2016-04-30 21:00:00 .. 2016-05-01 20:59:59 

更新

現地時間ごとに3時間を得るためにDatePeriodクラスを使用できます。

// A 3 hours interval 
$interval = new DateInterval('PT3H'); 
// A period that starts at today's 00:00:00 (local time) and ends at 23:59:59 
$period = new DatePeriod($dayStart, $interval, $dayEnd); 
// Iterate over it to get the moments every 3 hours 
foreach ($period as $moment) { 
    echo($moment->format('Y-m-d H:i:s')."\n"); 
} 

上記のコードにこのコードを追加すると、UTCで表される日付が取得されます。あなたは$dayStart$dayEndのタイムゾーンを変更するコードのブロックをスキップする場合は、上記のコードは印刷されます:

$tzoffset = date('Z'); 

2016-05-01 00:00:00 
2016-05-01 03:00:00 
2016-05-01 06:00:00 
2016-05-01 09:00:00 
2016-05-01 12:00:00 
2016-05-01 15:00:00 
2016-05-01 18:00:00 
2016-05-01 21:00:00 
関連する問題