对于一个简单的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时间戳整数转换为本地时间戳整数。希望这是可以理解的,任何人都可以想象这可以用于什么(在当地时间对齐时间轴图中的网格线)。
答案 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';
}