Как получить разницу (в секунды) между 2 датами без использования: strtotime, Zend Framework или грушевого пакета?

StackOverflow https://stackoverflow.com/questions/2068033

  •  20-09-2019
  •  | 
  •  

Вопрос

Как говорится в заголовке, я хочу получить разницу (в секундах) между 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) = секунды между ними

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top