2014-10-30 3 views
0

У меня есть приложение, в котором пользователи вводят время/даты, которые затем преобразуются через strtotime() в временные метки Unix (пользователи устанавливают свои собственные часовые пояса). Это обычно работает достаточно хорошо; strtotime() даже удается преобразовать время, такое как 2:15 AM, 9 марта 2014 года в метку времени (что соответствует временной отметке, которая будет возвращена, если пользователь вводит «3:15 AM 9 марта 2014 года»).PHP strtotime и DST

Однако, скажем, пользователь хочет ввести время утром 2 ноября 2014 года - в частности, между 2:00 и 3:00. Есть ли элемент, который пользователи могут добавить, чтобы указать , который будет использоваться для времени?

Например, если пользователь передает «2:15 AM 2 ноября 2014 года» через strtotime(), результатом является отметка времени UNIX, соответствующая «второй» 2:15 в эту дату.

Как определить «первый» 2:15?

+1

Я предлагаю вам использовать классы 'DateTime' и' DateTimeZone' вместо 'strtotime()' – Phil

+0

Извините за наивный вопрос, но я не уверен, как это было бы полезно для пользователей? Я понял, что мой первоначальный пост был несколько неясным, поэтому я его отредактировал. В настоящий момент приложение принимает вход от пользователей, таких как «2:15 AM 2 ноября 2014 года». Есть ли строка, в которой * user * (а не кодер, как я неправильно написал в своем OP), может войти, чтобы сообщить программе *, которая * "2:15" они намеревались? Или это то, что я должен использовать DateTime в любом случае? Опять же, извините за путаницу! – user3092995

+1

В принципе нет решения. 2 ноября 2: 2 часа. Вы просто ничего не делаете в течение этого времени, если только вы не возражаете, что вам придется ждать час. Вот почему переключение происходит в середине ночи в выходные, чтобы уменьшить проблемы, которые приводят к минимуму. Официального решения этой двусмысленности нигде в реальном мире я не знаю. – deceze

ответ

0

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

Например, говорят, что вы работаете с часовым поясом США Восточной ("America/New_York"), вы можете включить смещение, как это:

strtotime('2:15 AM November 2, 2014 -0400') // 1414908900 
strtotime('2:15 AM November 2, 2014 -0500') // 1414912500 

Или аббревиатуры:

strtotime('2:15 AM November 2, 2014 EDT') // 1414908900 
strtotime('2:15 AM November 2, 2014 EST') // 1414912500 

Теперь причина, почему я сказал «обычно» объясняется тем, что аббревиатуры часового пояса могут быть неоднозначными. При проверке Wikipedia's list of time zone abbreviations существует 2 разных интерпретации «EST». Некоторые из них намного хуже, например, 5 различных интерпретаций «CST». В целом, нехорошо полагаться на сокращения временных зон для ввода . Придерживайтесь смещений, и все будет хорошо.

Конечно, вам все равно необходимо знать, какие смещения применимы к тем часовым поясам. В PHP вы можете использовать для этого timezone_offset_get.

Вы также можете быть заинтересованы в this question, and it's answer, что может помочь вам определить, является ли ваше время ввода недопустимым или неоднозначным. Затем вы можете запросить пользователя, и (в двусмысленном случае) попросите их выбрать один из двух возможных смещений.