Validasi tanggal dalam shell

14

Saya ingin memvalidasi format tanggal di bawah ini dalam skrip shell

2015-Jul-13

Saya menggunakan date -d "2015-Jul-13" +"%Y-%b-%d"tetapi memberikan kesalahan sebagai

date: invalid date '2015-Jul-13'
chhaya vishwakarma
sumber
@ Pandya: OP jelas tentang pertanyaannya. OP ingin memvalidasi (memeriksa tanggal yang dimasukkan valid atau tidak) format tanggal yang disebutkan tetapi mengatakan tanggal yang dimasukkan tidak valid.
Thushi
GNU datetidak mengenali YYYY-MMM-DD. Bisakah Anda menggunakan YYYY-MM-DDatau DD MMM YYYYsebagai gantinya?
roaima
Saya cukup yakin at, dan - saya pikir - touchjuga. Saya menulis funvtion shell validasi tanggal berdasarkan touchsekali ... tidak, tidak touch- itu hanya menangani angka, tetapi atmelakukan beberapa penguraian yang cukup dalam ...
mikeserv
@Thushi mari kita hapus komentar yang berlebihan oleh kita
Pandya
6
Salah membaca judul: Validasi tanggal adalah neraka
Adam Davis

Jawaban:

12

GNU datetidak mendukung YYYY-MMM-DD. Namun, ia mengerti DD-MMM-YYYY. Jadi jika Anda benar-benar harus menangani tanggal format ini, Anda dapat melakukannya dengan sesuatu seperti ini, yang hanya menukar argumen sekitar ke format yang datemengharapkan:

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

Inilah solusi lengkapnya. Memecahnya, IFS=-instruksi memberitahu shell untuk membagi baris perintah yang akan datang dengan tanda hubung -bukan spasi. The set $ymdmengurai $ymdvariabel seperti untuk baris perintah, tapi sekarang membagi oleh tanda hubung, menetapkan nilai untuk parameter $1, $2 et seq . Secara echo "$3-$2-$1"sepele mengeluarkan tiga nilai yang ditangkap dalam urutan terbalik.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
roaima
sumber
@ mikeserv: Coolness! Itu bekerja dengan: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") Bisakah Anda mengungkapkan keajaiban di balik setperintah?
joepd
11

Dari manual: -

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.

Tapi sepertinya YYYY-MMM-DDformatnya tidak dikenali . Jadi, Anda dapat menggunakan dari bawah atau sejenisnya seperti:

$ 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

ATAU Anda harus mengonversi / memformat ulang sebelum mengirim ke date!

Lihat juga Bagaimana Anda menentukan format untuk input hingga saat ini?


Saya sarankan untuk Mengunjungi: Format input tanggal .

Ini peraturannya.

Untuk bulan numerik , format ISO 8601 'tahun-bulan-hari' diperbolehkan, di mana tahun adalah angka positif, bulan adalah angka antara 01 dan 12, dan hari adalah angka antara 01 dan 31. Angka nol di depan harus ada jika jumlahnya kurang dari sepuluh. Jika tahun 68 atau lebih kecil, maka 2000 ditambahkan ke dalamnya; jika tidak, jika tahun kurang dari 100, maka 1900 ditambahkan ke dalamnya. Konstruk 'bulan / hari / tahun', populer di Amerika Serikat, diterima. Juga 'bulan / hari', menghilangkan tahun.

Bulan harfiah - bisa dijabarkan secara lengkap: 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', ' November 'atau' Desember '. Bulan harfiah dapat disingkat menjadi tiga huruf pertama mereka, mungkin diikuti oleh titik singkatan. Juga diizinkan menulis 'September' alih-alih 'September'.

Ketika bulan ditulis secara harfiah , tanggal kalender dapat diberikan sebagai salah satu dari yang berikut:

 hari bulan tahun
 hari bulan
 bulan hari tahun tahun
 -bulan-tahun

ditekankan oleh saya

Di sini Anda dapat melihat bahwa tidak ada format seperti tahun-bulan-hari ! (berbulan-bulan ditulis secara harfiah)

Pandya
sumber
7

Dengan zshAnda dapat menggunakan strftimebuiltin (tersedia via zsh/datetime) dengan -r(terbalik):

strftime -r timestring format

yang menggunakan format untuk mengurai timestring dan menampilkan jumlah detik sejak zaman:

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

Kesalahan ini keluar jika tanggal tidak valid:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: format tidak cocok

Anda juga dapat mengonversi detik sejak zaman ke format standar / tanggal kustom lainnya, mis

strftime '%A, %B %d, %Y' 1447970400
Jumat, 20 November 2015
don_crissti
sumber