Вычислить дату по числовому значению - PullRequest
0 голосов
/ 21 апреля 2010

Число 71867806 представляет текущий день с наименьшей единицей дней . Извините, кеширование принадлежит мне, на самом деле это миллисекунды!

Как я могу

  • рассчитать текущую дату из нее?
  • (или) преобразовать его в метку времени Unix?

Решение не должно использовать функции, зависящие от языка.

Спасибо!

Ответы [ 6 ]

3 голосов
/ 21 апреля 2010

Это зависит от:

  • Какую единицу представляет это число (дни, секунды, миллисекунды, тики?)
  • Когда начальная дата была

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

1 голос
/ 21 апреля 2010

Сколько времени: 71 867 806 мс с полуночи?

Есть:
- 86 400 000 мс / день
- 3600000 мс / час
- 60000 мс / мин
- 1000 мсек / с

Удалите и подсчитайте эти единицы, пока у вас не будет времени, как указано ниже:

Сколько дней? Нет, потому что 71 867 806 меньше 86 400 000

Сколько часов? Максимальное количество 3 600 000 может быть удалено 19 раз 71 867 806 - (3 600 000 * 19) = 3 467 806 мс осталось.

Сколько минут? Максимальное время 60 000 может быть удалено 57 раз. 3467806 - (60 000 * 57) = 47 806 мс осталось

Сколько секунд? Максимальное количество раз 1000 можно удалить - 47 раз. 47806 - (1000 * 47) = 806

Итак, время: 19: 57: 47.806

1 голос
/ 21 апреля 2010

Во-первых, у вас есть только одно очко, и этого недостаточно.Получить номер для «завтра» и посмотреть, если это 71867806 + 1.Если это так, то вы можете смело ставить, что +1 означает +1 день.Если это что-то вроде завтра-сегодня = 24, то шансы +1 означают +1 час, а логика для отображения дней показывает только часть «день».Если это что-то еще, проверьте, не близко ли это (24 * 60, что будет в минутах), (24 * 60 * 60, что будет в секундах) или (24 * 60 * 60 * 1000, что будет в миллисекундах).

Когда у вас есть представление о том, какие единицы вы используете, вы можете оценить, сколько лет назад была дата «начала» 0.Посмотрите, совпадает ли это с какой-либо из распространенных календарных систем, расположенных по адресу http://en.wikipedia.org/wiki/List_of_calendars.. Скорее всего, используемый вами календарь - это не действительно новое создание, а переопределение существующего календаря.Если кажется, что это очень далеко назад, это может быть юлианская дата, которая имеет день 0, эквивалентный BCE 4713 01 января 12: 00: 00.0 UT понедельник.Юлианские даты и модифицированные юлианские даты часто используются в астрономических расчетах.

Следующая главная цель - найти 1 января 1970 г. 00:00:00.Если вы можете найти число, представляющее эту дату, вы просто вычтете его из этой внешней календарной системы и преобразуете остаток от обнаруженных единиц в миллисекунды.Это даст вам время UNIX, которое вы затем сможете использовать со стандартными утилитами UNIX для преобразования времени в любой часовой пояс, который вам нравится.

В конце вы не сможете быть на 100% уверены, что вашпреобразование точно такое же, как и в ручной системе, но если вы можете проверить свои предположения о календаре, подключив числа и посмотрев, отображаются ли они так, как вы прогнозировали.Используйте эту технику, чтобы создать ряд тестов, которые помогут вам определить, как эта система справляется с високосными годами и т. Д. Помните, что она может вообще не справиться с ними!

1 голос
/ 21 апреля 2010

Если это действительно целое число дней, а число, которое вы дали на сегодня (21 апреля 2010 года, для меня, как я читаю это), то «нулевой день» (эпоха) был достаточно 71867806 дней назад. Я не могу даже вообразить, почему кто-то выбрал бы это, хотя - это работает приблизительно 196 763 года назад (~ 194 753 до н.э, если Вы предпочитаете). Кажется, это довольно странное время для выбора, и я собираюсь догадаться, что это нечто большее, чем то, что вы нам сказали (возможно, больше, чем вы знаете).

Мне кажется, первое, что нужно сделать, это убедиться, что число увеличивается на единицу каждые 24 часа. Если это вообще возможно, следите за точным временем, когда оно увеличивается.

0 голосов
/ 23 апреля 2010

Снова извините за грязный вопрос, я получил решение сейчас. В js это выглядит так:

var dayZero = new Date(new Date().getTime() - 71867806 * 1000);
0 голосов
/ 21 апреля 2010

Это действительно довольно давно, если наименьшее число в днях. Однако, предполагая, что вы уверены в этом, я мог бы предложить следующую команду оболочки, которая, очевидно, была бы недействительной для дат до 1 января 1970 года:

date -d "@$(echo '(71867806-71853086)*3600*24'|bc)" +%D

или без БК:

date -d "@$(((71867806 - 71853086) * 3600 * 24))" +%D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...