Chcę sprawdzić poprawność poniższego formatu daty w skrypcie powłoki
2015-Jul-13
Używam, date -d "2015-Jul-13" +"%Y-%b-%d"
ale daje błąd jako
date: invalid date '2015-Jul-13'
shell-script
date
chhaya vishwakarma
źródło
źródło
date
nie rozpoznajeYYYY-MMM-DD
. Czy możesz użyćYYYY-MM-DD
lubDD MMM YYYY
zamiast tego?at
, że tak, i - tak myślę -touch
również. Napisałem funkcję powłoki sprawdzania poprawności daty opartą natouch
raz ... nie, nietouch
- obsługuje tylko cyfry, aleat
wykonuje dość głęboką analizę ...Odpowiedzi:
GNU
date
nie obsługujeYYYY-MMM-DD
. Jednak to rozumieDD-MMM-YYYY
. Więc jeśli naprawdę musisz poradzić sobie z datami tego formatu, możesz to zrobić za pomocą czegoś takiego, co po prostu zamienia argumenty na format, którydate
oczekuje:Oto rozwiązanie dla wszystkich powłok. Po rozbiciu
IFS=-
instrukcji instruuje powłokę, by podzieliła nadchodzącą linię poleceń łącznikiem-
zamiast białych znaków.set $ymd
Analizuje$ymd
zmiennej za pomocą linii poleceń, ale rozdziela się przez łącznik, przypisując wartości parametrów$1
,$2
i nast .echo "$3-$2-$1"
Trywialny wyjścia trzech wykonanych wartości w odwrotnej kolejności.źródło
ymd=$(IFS=-;set $ymd; echo "$3-$2-$1")
Czy możesz odkryć magię stojącą za tymset
poleceniem?Z strony podręcznika: -
Ale wydaje się, że nie rozpoznaje
YYYY-MMM-DD
formatu. Możesz więc użyć albo od dołu, albo w podobny sposób:LUB musisz przekonwertować / sformatować go przed wysłaniem do
date
!Zobacz także Jak określić format danych wejściowych do tej pory?
Polecam odwiedzić: Formaty wprowadzania daty .
podkreślone przeze mnie
Tutaj możesz zobaczyć, że nie ma takiego formatu jak rok-miesiąc-dzień ! (od miesięcy są pisane dosłownie)
źródło
Z
zsh
można wykorzystaćstrftime
polecenie wbudowane (dostępne za pośrednictwemzsh/datetime
) z-r
(reverse):który używa formatu do parsowania timestringu i wyświetla liczbę sekund od epoki:
Błąd ten pojawia się, jeśli data jest nieprawidłowa:
Możesz także przekonwertować sekundy od epoki na dowolny inny standardowy / niestandardowy format daty, np
źródło