【问题标题】:Convert a UNIX timestamp into local time (as integer)将 UNIX 时间戳转换为本地时间(作为整数)
【发布时间】:2016-05-01 11:23:43
【问题描述】:

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

【问题讨论】:

  • 不要使用时间戳进行此类计算。使用 DateTime 类及其亲属。
  • 为什么你认为时间戳是UTC而不是本地服务器时间?
  • @axiac 那么你建议如何找到一个与 3 小时对齐的开始时间?模很简单。 DateTime 类可以这样做吗?
  • @splash58 这是根据定义。做你自己的测试,你会发现时间戳是 UTC 纪元以来的秒数,而不是本地时间。
  • DateTime 类可以做的不止这些。它还负责 DST、时区、日期格式、日期时间操作(日期间隔的加法、减法)。

标签: php


【解决方案1】:

使用datetime class 并设置date_default_timezone_set

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

根据您的 cmets 更新:

我有一个不是“现在”的时间戳,需要将 DST 偏移量应用于 它。

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


注意:

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

【讨论】:

  • 哇,你是怎么找到getTimestamp方法的?它没有记录,但无论如何我都需要它。除此之外,这不是我需要的。我有一个不是“现在”的时间戳,需要对其应用 DST 偏移量。
  • PHP 负责夏令时。必要的转换规则是 PHP 安装的一部分。
  • 仍然没有帮助,抱歉。
  • 我想您必须更新您的问题,包括一个清晰的示例和所需的输出。
  • 它发生了...... tks!
【解决方案2】:

最好的方法是使用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'));

【讨论】:

  • 再一次,这将如何帮助我找到与当地时间 24 或 3 小时对齐的“整数”?如果我有一个整数,我可以使用模数。
  • @LonelyPixel 好吧,现在你知道该去哪里了,我认为你应该深入了解 PHP 手册。你已经有了钓竿。 ;)
【解决方案3】:

一种可能的实现方式:

// 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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2023-03-18
      • 2013-04-07
      • 2017-08-24
      • 1970-01-01
      • 2016-01-14
      相关资源
      最近更新 更多