Как получить разницу (в секунды) между 2 датами без использования: strtotime, Zend Framework или грушевого пакета?
Вопрос
Как говорится в заголовке, я хочу получить разницу (в секундах) между 2 (в частности между настоящим и датой в прошлом) без использования: Strtotime, Zend Framework или Pear Package.
Я не хочу вдаваться в подробности своей причины, но суть этого в том, что я работаю с очень старыми датами (и я имею в виду старый, я говорю до 0 нашей эры).
Предпочтительно, что возвращаемый результат был очень точным до второй из данной текстовой метки времени. Формат для вызова функции должен быть похож на:
$bar = foo("YYYY-MM-DD HH:MM:SS", "AD"); // Where AD is Anno Domini
$baz = foo("YYYY-MM-DD HH:MM:SS", "BC"); // Where BC is Before Christ
Первый человек, который предлагает работу, которая включает в себя:
- Высокая читаемость
- Нет магии (тройные операторы и т. Д.)
Получит их ответ на ответ и принят. Их имя будет зачислено в заголовке исходного файла, который использует их код.
Редактировать (Re: Fame):
Кто -то сказал, что имя, зачисленное в заголовок, выглядит плохо и может быть отредактировано. Я говорю о заголовке исходного файла, который использует нужную функцию. Это не «слава». Следует предоставить кредит, где должен быть предоставлен кредит, и мне не нужно лгать о том, кто является автором работы.
Редактировать (Re: точная):
Никакой причины, кроме того, я хочу сохранить с «буквой сообщения» как можно лучше.
Редактировать (Re: Magic):
Магия - это разные вещи для разных людей. Что касается тройного оператора, пожалуйста, уважайте мое мнение, как я уважаю ваше. Спасибо.
Редактировать (Re: Старые даты и одна секундная точность):
Как студент истории, это имеет смысл для меня. Стремление к «одной секунду точности» не является абсолютным. Совершенство, хотя и достижимо, не требуется.
Решение
Я бы посоветовал разделить каждое время DateTime на части (год, месяц, дата, часы, минуты, секунды). Затем, с каждой частью, сделайте основную сумму наиболее большей минус менее недавней (помните, что дата BC фактически является отрицательным числом).
Вы никогда не получите это абсолютно правильно. Вам придется рассмотреть прыжок, и является ли годом столетия, переход между григорианскими/юлианскими датами и т. Д.
Кроме того, я хотел бы узнать ваши рассуждения об ограничениях и высокой точности точности!
Другие советы
Для всех таких вопросов см. Календрические расчеты (Google для него).
О, и не было ни года по нему, календарь перешел от 1BC до 1AD, или, скорее, мы, современные жители Запада, определяем календарь таким образом, в то время, когда большая часть мира использовала другие системы.
Или звоните в онлайн-калькуляторы, такие как Вот этот И сэкономить много времени.
Некоторые языки и базы данных датируются арифметикой, некоторые нет. Если вы храните даты в базе данных, попробуйте Postgres:
pg=> SELECT now() - 'January 8, 52 BC'::DATE;
-----------------------------
754835 days 20:27:31.223035
Если вы не используете DB, то это становится немного более проблематичным. Арифметика даты PHP ... ну, я бы предпочел не говорить об этом. Python's очень хороший, но он начинается в 1 году до н.э..
Вам, возможно, придется бросить свой ...
Почему бы вам не вычесть временные метки?
mktime(16,59,0,8,7,2001) - mktime(16,59,0,8,7,2000)
= секунды между ними