Значения времени PHP при переходе на летнее время (DST) - PullRequest
0 голосов
/ 28 мая 2018

Я разрабатываю систему для регистрации, которая должна складываться все время, когда кто-то был в сети на моем сервере.Я хочу принять во внимание также те дополнительные часы, которые должны быть добавлены или вычтены из общего количества, когда время изменяется из-за летнего времени.

Легко вычесть час в третье воскресенье марта, потому что мне нужно только проверить, было ли время подписания до 2:00 и время выхода после 3:00;также легко, когда в октябре кто-то входит в систему до 2:00 и выходит после 3:00, в этом случае мне нужно добавить только час.

Но как насчет входа между 2 и 3:00 (скажем,2:30) в последнее воскресенье октября?Как я узнаю, будет ли это первый раз в 2:30 или во второй раз?В первом случае я должен добавить полчаса к итогу, тогда как во втором случае я должен оставить все как было раньше.

Функция PHP time () дает разные значения, когда она равна 2:30 дляв первый раз, чем когда это во второй раз?Я полагаю, что так и должно быть, поскольку он возвращает количество секунд с начала эпохи Unix, и оно не должно быть одинаковым для обоих случаев, но я хотел бы подтвердить это.

Редактировать 1: Это кодчтобы вычислить два случая, которые я упомянул, где это было достаточно просто:

  • (timeChangingDates - это функция, написанная мной самостоятельно, которая, учитывая год, возвращает массив длины 2. В первой позиции будетбыть последним воскресеньем марта, в которое время меняется, а во второй позиции - последним воскресеньем октября)
  • ($ 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 ().

...