Точная дата - "следующий понедельник"
Я пытаюсь написать быстрый сценарий, который вычисляет дату следующего понедельника, а не сегодня. Хотя команда date принимает это выражение, она, по-видимому, интерпретирует его как эквивалент "этого понедельника". То есть, если сегодня понедельник, он генерирует сегодняшнюю дату, в противном случае - понедельник следующей недели.
Любые идеи, как сделать это с помощью команды date (или действительно любой команды, доступной для bash), не прибегая к самостоятельной арифметике даты?
Обновление: это выглядит странно в моей среде, так как несколько человек показали, что команда работает в своих системах, как и ожидалось. Вот что я вижу:
$ date
Tue Jul 31 23:38:28 UTC 2012
$ date -d 'next tuesday'
Tue Jul 31 00:00:00 UTC 2012
$ date --version
date (GNU coreutils) 5.97
Похоже, у меня есть древняя версия даты, возможно, это моя проблема...
2 ответа
Дата GNU, кажется, работает правильно.
error@underground ~/Downloads $ date -d "next monday"
Mon Aug 6 00:00:00 EDT 2012
error@underground ~/Downloads $ date -d "next tuesday"
Tue Aug 7 00:00:00 EDT 2012
error@underground ~/Downloads $ date -d "next wednesday"
Wed Aug 1 00:00:00 EDT 2012
error@underground ~/Downloads $ date --version
date (GNU coreutils) 8.15
Убедитесь, что ваша система действительно имеет правильную дату, время и часовой пояс.
Также убедитесь, что вы используете относительно свежую версию GNU coreutils. Поведение, которое вы описали, было ошибкой в старых версиях coreutils, которая была исправлена в версии 6.0.
date: команда типа date -d '2006-04-23 21 день назад' напечатает неправильную дату в некоторых часовых поясах. (см тест для примера)
Вы уверены, что нет проблем с тем, как вы выполняете команду в сценарии, возможно, отсутствуют кавычки или что-то в этом роде? Я не могу воспроизвести вашу проблему.
$ date
Tue Jul 31 19:08:50 EDT 2012
$ date -d "next tuesday"
Tue Aug 7 00:00:00 EDT 2012
$ date -d "this tuesday"
Tue Jul 31 00:00:00 EDT 2012
$ date --version
date (GNU coreutils) 8.5