2016-02-25 3 views
2

Я пытаюсь найти количество дней между сегодняшней датой и очень далекой датой в будущем (02/25/2362). Даты форматируются как mm/dd/yyyy.Bash: количество дней между сегодняшним днем ​​и очень далеким будущим Дата

#!/bin/sh 

now=$(date +%m/%d/%Y) 
purge_date="02/25/2362" 

#echo "$now" 
#echo "$purge_date" 

date1_unix=`date -d $now +%s` 
date2_unix=`date -d $purge_date +%s` 

#echo "$date1_unix" 
#echo "$date2_unix" 

diff=`expr $date2_unix - $date1_unix` 
diff_days=`expr $diff/86400` # Number of seconds in a day are 86400 
echo $diff_days 

Этот подход работает, когда будущая дата рядом, но в течение 2362 года, как показано на рисунке, я получаю сообщение об ошибке:

date: invalid date `02/25/2362' 
expr: syntax error 
expr: syntax error 
+0

Я сомневаюсь, что в 2362. Есть еще bash. – hek2mgl

+0

Извините, я не мог следовать за вами. – Deepak

+1

это может быть https://en.wikipedia.org/wiki/Year_2038_problem – ritesht93

ответ

0

Если вы заинтересованы только в количество дней

$((($(date --date="30001020" +%s) - $(date --date="19701020" +%s))/(60*60*24))) 

Это даст нам значение между датами 3000-Oct-20 и 1970-Oct-20 Преобразование даты, с которой я вернусь, % s не нужно, но это то, что я тестировал.

+0

Это очень наивное решение и довольно неточно, потому что оно игнорирует [прыжок секунд] (https: // en.wikipedia.org/wiki/Leap_second). – ceving

+0

@ceving, довольно сложно объяснить все прыжковые секунды между настоящим и февралем 2362 года, учитывая, что мы не знаем даже секунд прыжка в следующем году ... –

+0

Разве это не эквивалентно тому, что делает OP? –

0

Вам необходимо рассчитать Julian day number обеих дат. Объясняется here, как это сделать. После этого вы можете вычесть два значения.

0

Из информации, добавленной в комментариях, кажется, что вы используете версию date, которая не может обрабатывать такие далекие даты. Рассматривая вывод ошибок для date -d 02/25/2362, мы видим

date: invalid date 02/25/2362 

Возможно модернизировать date исполняемые, но может оказаться, что нет (существующей) реализация даты для 32-разрядных Linux имеет достаточный диапазон, оставляя вас изменить ОС или написать необходимый код для существующего date.

Для получения информации, я могу подтвердить, что реализация даты, которую я использую (64-разрядная версия Linux x86-64 ELF, date (GNU coreutils) 8.21) успешно справляется с датами в двадцать миллиардов лет с обеих сторон настоящего.

В качестве альтернативы, скорее всего, стоит потратить на то, чтобы ваш скрипт вышел раньше, если команда date терпит неудачу, вместо того, чтобы позволить ей распространять плохие входы на остальную часть вашего расчета. Простой способ сделать это - передать опцию -e в вашу оболочку (при условии, что Bourne-подобная оболочка, такая как Bash или Dash). Вы можете сделать это, добавив его в строку #! или написав set -e в начале программы.

Смежные вопросы