簡體   English   中英

將UNIX時間戳轉換為本地時間(整數)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM