[英]Convert a UNIX timestamp into local time (as integer)
對於簡單的PHP圖形腳本,我需要在當地時間調整時間值。 當我執行類似$timestamp % 86400 == 0
時,因為我現在處於UTC +2,所以每天凌晨2點都有休息。 我所有的網格線也都是凌晨2點,5點,8點等,而不是0點,3點,6點等。
我知道UNIX時間戳記整數值始終以UTC表示,並且存在date()
和gmdate()
等等,但是我需要在本地時間使用整數來對其進行算術運算。 我將如何在PHP中做到這一點? .NET中是否有諸如ToLocalTime()
和ToUniversalTime()
類的函數?
為了澄清這個問題,我與時間的可讀格式無關。 沒有YYYY-MM-DD HH:MM:SS之類的,我只處理數字。 輸入是自UTC的紀元(也稱為UNIX時間戳)以來的秒數。 我需要的是相同類型的數字,但不是UTC的,而是本地時間的。 因此,我需要將UNIX時間戳整數轉換為本地時間戳整數。 希望這是可以理解的,並且任何人都可以想象這可以用於什么(在本地時間在時間軸圖中對齊網格線)。
使用datetime類並設置date_default_timezone_set
date_default_timezone_set('Europe/Lisbon');
$date = new DateTime();
echo $date->getTimestamp();
根據您的評論進行更新:
我有一個不是“現在”的時間戳,需要對其應用DST偏移量。
PHP
負責DST。 必要的轉換規則是PHP
安裝的一部分。
注意:
Unix時間戳不受時區設置的影響 。 設置時區只會影響時間戳值的解釋。
最好的方法是使用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'));
可能的實現:
// 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
更新
為了每三小時獲取一次本地時間,可以使用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
時區的代碼塊,則將顯示以上代碼:
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
我最終使用它來確定本地時間UTC偏移量:
$tzoffset = date('Z');
然后,我只是在時間戳中添加或減去該值,並將其視為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';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.