дата не распознает формат% d-% m-% Y - PullRequest
0 голосов
/ 26 мая 2018

Мой сценарий должен принимать 4 формата даты: гггг-мм-дд, гггг / мм / дд, дд-мм-гггг, дд / мм / гггг.

Чтобы проверить, указана ли пользователем дата dдопустимый в любом из этих форматов, он делает что-то вроде этого:

    if [ "`date '+%Y-%m-%d' -d $d 2>/dev/null`" == "$d" ]
      then
        echo "1"
    elif [ "`date '+%d-%m-%Y' -d $d 2>/dev/null`" == "$d" ]
      then
        echo "2"
    elif [ "`date '+%Y/%m/%d' -d $d 2>/dev/null`" == "$d" ]
      then
        echo "3"
    elif [ "`date '+%d/%m/%Y' -d $d 2>/dev/null`" == "$d" ]
      then
        echo "4"
    else
        echo `date '+%d-%m-%Y' -d $d`
        echo "other"
    fi

Если я установлю d на 2018-01-01, 2018/01/01 или 01.01.2008, я получу ожидаемый выходной сигнал (1, 3 и 4 соответственно).

Если я использую 01-01-2018, то вывод:

date: invalid date `01-01-2018'

other

В чем может быть причина?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

В GNU date спецификатор +format указывает желаемый формат output , а не способ анализа аргумента опции -d.

( BSD date позволяет указать формат ввода с помощью -f, но я полагаю, что вы работаете в Linux.)

Для угадывания формата ввода я быпредложите что-то вроде

case $d in
    [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
      # assume yyyy-mm-dd
      ;;
    [0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9])
      # in the civilized world, assume dd/mm/yyyy
      # in the US, assume mm/dd/yyyy
      # in the general case, assume nothing; give up
      ;;
    ... etc ...
esac

Обратите внимание, что на самом деле нет никакого способа узнать, представляет ли 4/3 4 марта или 3 апреля.Требование пользователя использовать однозначный формат или явно указать, как интерпретировать формат, является единственным разумным решением.

Функции команды date не связаны с используемой оболочкой.

0 голосов
/ 26 мая 2018

Это происходит потому, что числовые строковые форматы даты, которые date считает допустимыми, весьма ограничены.Согласно документации формат "день-месяц-год" не включен в принятые форматы ( 29.2 ):

Для числовых месяцев:Разрешен формат ISO 8601 «год-месяц-день», где год - любое положительное число, месяц - число от 01 до 12, а день - число от 01 до 31. Если число является начальным, должен присутствовать начальный ноль.меньше десятиЕсли год равен 68 или меньше, к нему добавляется 2000;в противном случае, если год меньше 100, к нему добавляется 1900.Популярна в США конструкция «месяц / день / год».Также 'месяц / день', пропуская год.

Я думаю, что реализация обходного пути в вашем bash-скрипте не должна быть трудной, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...