Перевірка дати в оболонці


14

Я хочу перевірити нижченаведений формат дати в сценарії оболонки

2015-Jul-13

Я використовую, date -d "2015-Jul-13" +"%Y-%b-%d"але його помилка надання як

date: invalid date '2015-Jul-13'

@Pandya: ОП зрозуміло щодо його / її питання. ОП хоче підтвердити (перевірити, чи введена дата дійсна чи ні) згаданий формат дати, але він говорить, що введена дата недійсна.
Сухіхи

GNU dateне розпізнає YYYY-MMM-DD. Чи можете ви використати YYYY-MM-DDабо DD MMM YYYYзамість цього?
roaima

Я впевнений, що atце так, і - я думаю, - touchце також. Я написав функцію оболонки для перевірки дати на основі touchодного разу ... ні, не touch- вона обробляє лише цифри, але atробить досить глибокий розбір ...
mikeserv

@Thushi давайте ясний зайвий коментар від нас
Pandya

6
Непрочитано заголовок: Дата перевірки - пекло
Адам Девіс

Відповіді:


12

GNU dateне підтримує YYYY-MMM-DD. Однак це розуміє DD-MMM-YYYY. Отже, якщо вам справді доводиться обробляти дати цього формату, ви можете зробити це з чимось подібним, яке просто замінює аргументи навколо на очікуваний формат date:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

Ось все рішення оболонки. Розбиваючи його, IFS=-інструкція вказує оболонці розділити майбутній командний рядок дефісом -замість пробілу. set $ymdРозбирає $ymdзмінну як для командного рядка, але тепер розщеплюється з допомогою дефіса, присвоєння значень параметрів $1, $2 і сл . echo "$3-$2-$1"Тривіальні виводять три захоплених значень в зворотному порядку.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

@mikeserv: Прохолода! Це працювало з: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") Чи не могли б ви розкрити магію setкоманди?
joepd

11

З manpage: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

Але YYYY-MMM-DDформат, схоже, не розпізнає . Отже, ви можете використовувати або знизу, або подібне, як:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

АБО ви повинні конвертувати / переформатувати її перед відправленням date!

Також див. Як ви визначаєте формат введення на сьогодні?


Рекомендую відвідати: формати введення дати .

Ось правила.

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

Буквальні місяці можуть бути прописані повністю: "січень", "лютий", "березень", "квітень", "травень", "червень", "липень", "серпень", "вересень", "жовтень", " Листопад "або" Грудень ". Буквальні місяці можуть бути скорочені до їх перших трьох букв, можливо, слідуючи скорочувальною крапкою. Також дозволено писати "вересень" замість "вересень".

Коли місяці пишуться буквально , дату календаря можна вказати як будь-яке з наведених нижче:

 день місяць рік рік
 день місяць
 місяць день рік
 день місяць місяць

підкреслений мною

Тут ви бачите, що такого формату, як рік-місяць-день, немає ! (місяцями пишуться буквально)


7

З zshвами можна використовувати strftimeвбудований (доступний через zsh/datetime) з -r(реверс):

строк -r формат хронометражу

який використовує формат для аналізу часу і виведення кількості секунд після епохи:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

Ця помилка виходить, якщо дата недійсна:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strroll: 5: формат не збігається

Ви також можете конвертувати секунди з епохи в будь-який інший стандартний / спеціальний формат дати, наприклад

strftime '%A, %B %d, %Y' 1447970400
П’ятниця, 20 листопада 2015 року
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.