将UNIX时间戳转换为本地时间(作为整数)

时间:2016-05-01 11:23:44

标签: php

对于一个简单的PHP图形脚本,我需要在当地时间对齐时间值。当我做$timestamp % 86400 == 0这样的事情时,我每天凌晨2点休息一下,因为我在这里是UTC + 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时间戳整数转换为本地时间戳整数。希望这是可以理解的,任何人都可以想象这可以用于什么(在当地时间对齐时间轴图中的网格线)。

4 个答案:

答案 0 :(得分:2)

使用datetime class并设置date_default_timezone_set

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

根据您的评论进行更新:

  

我的时间戳不是"现在"并需要应用DST偏移量   它

PHP负责DST。必要的转换规则是PHP安装的一部分。

注:

unix时间戳不受时区设置的影响。设置时区仅影响时间戳值的解释。

答案 1 :(得分:1)

最好的方法是使用DateTime API 所以你可以通过DateTimeZone类来处理时区,如下所示:

.navbar-brand {
  position: absolute;
  width: 100%;
  left: 0;
  top: 0;
  text-align: center;
  margin: auto;
  font-size: 36px;
}

答案 2 :(得分: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

<强>更新

为了每三小时获取一次本地时间,您可以使用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

答案 3 :(得分:0)

我最终使用它来确定本地时间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';
}