夏令时(DST)时的PHP时间值

时间:2018-05-28 11:54:15

标签: php time dst

我正在开发一个注册系统,这个系统应该总是有人在我的服务器上联机。我还要考虑由于夏令时因时间变化而必须在总数中加上或减去的额外时间。

在3月的第三个星期日很容易减去一个小时,因为我只需要检查签约时间是否在凌晨2点之前以及凌晨3点之后的退出时间; 10月份有人在凌晨2点之前登记并在凌晨3点后退出,这也很容易,在这种情况下,我只需要增加一个小时。

但是在10月的最后一个星期天2点到3点之间签约(让我们说2点30分)呢?我怎么知道这是第一次是2:30还是第二次?在第一种情况下,我应该增加半小时的总数,而在第二种情况下,我应该保持原样。

PHP的time()函数第一次是2:30而不是第二次时给出不同的值吗?我认为它应该,因为它返回自Unix时代以来的秒数,并且在两种情况下都不应该相同,但我想确认它。

编辑1: 这是计算我提到的两个案例的代码,它很容易:

  • (timeChangingDates是一个由我自己编写的函数,给定年份,它返回一个长度为2的数组。在第一个位置,将有3月的最后一个星期日,在这个时间里会发生变化,在第二个位置, 10月的最后一个星期天)
  • ($ startTime和$ endTime是存储登录和注销日期时间的DateTime对象)

    // If sign-in time is before 2AM and sign-out time after 3AM add an hour(October)
    if ((strtotime($startTime->format('Y-m-d H:i:s')) < strtotime(new DateTime($startTime->format("Y").'-10-'.timeChangingDates($startTime->format("Y"))[1].' 1:59:00')->format('Y-m-d H:i:s'))) && (strtotime($endTime->format('Y-m-d H:i:s')) > strtotime(new DateTime($startTime->format("Y").'-10-'.cambiosHorarios($startTime->format("Y"))[1].' 3:00:00')->format('Y-m-d H:i:s')))) {
        $totalTime = $totalTime + 60;
    // If sign-in time is before 2AM and sign-out time after 3AM subtract an hour(March)
    } else if ((strtotime($startTime->format('Y-m-d H:i:s')) < strtotime(new DateTime($startTime->format("Y").'-3-'.timeChangingDates($startTime->format("Y"))[0].' 1:59:00')->format('Y-m-d H:i:s'))) && (strtotime($endTime->format('Y-m-d H:i:s')) > strtotime(new DateTime($startTime->format("Y").'-3-'.cambiosHorarios($startTime->format("Y"))[0].' 3:00:00')->format('Y-m-d H:i:s')))) {
        $totalTime = $totalTime - 60;
    }
    

我还没有尝试任何方式来处理上面提到的第三个案例,因为我无法在Windows上模拟时间变化。这就是为什么我想知道是否只使用time()会起作用。

0 个答案:

没有答案