Kabukta tarih doğrulaması


14

Kabuk betiğinde aşağıdaki tarih biçimini doğrulamak istiyorum

2015-Jul-13

Kullanıyorum date -d "2015-Jul-13" +"%Y-%b-%d"ama hata veriyor

date: invalid date '2015-Jul-13'

@Pandya: OP sorusu hakkında açık. OP, belirtilen tarih biçimini doğrulamak istiyor (girilen tarihin geçerli olup olmadığını kontrol ediyor), ancak girilen tarihin geçersiz olduğunu söylüyor.
Thushi

GNU datetanımıyor YYYY-MMM-DD. Kullanabilir misiniz, YYYY-MM-DDyoksa DD MMM YYYYonun yerine?
roaima

Eminim atyapar ve - sanırım - da touchyapar. Bir kereye dayanan bir tarih doğrulama kabuğu funvtion yazdım touch... hayır, değil touch- sadece rakamları işler, ancak atbazı oldukça derin ayrıştırma yapar ...
mikeserv

@Thushi bizim tarafımızdan gereksiz yorumu temizleyelim
Pandya

6
Başlığı yanlış oku: Tarih doğrulaması cehennem
Adam Davis

Yanıtlar:


12

GNU datedesteklemiyor YYYY-MMM-DD. Ancak anlıyor DD-MMM-YYYY. Dolayısıyla, bu biçimin tarihlerini gerçekten işlemeniz gerekiyorsa, bunu böyle bir şeyle yapabilirsiniz, bu da argümanları datebeklediğiniz bir biçime çevirir:

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

İşte bütün bir kabuk çözümü. IFS=-Talimatları bozarak, komut satırına önümüzdeki bir komut satırını -boşluk yerine tire ile ayırmasını söyler . set $ymdAyrıştırır $ymdbir komut satırı olarak değişken, fakat şimdi parametrelere değerlerin tahsis, tire ile böler $1, $2 ve devamı . echo "$3-$2-$1"Trivially ters sırayla üç yakalanan değerleri çıkarır.

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: Serinlik! Şununla çalıştı: Komutun ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") arkasındaki sihri ortaya çıkarabilir misiniz set?
joepd

11

Manpage'den: -

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.

Ancak YYYY-MMM-DDformatı tanımıyor gibi görünüyor . Yani, aşağıdan veya benzer bir şekilde kullanabilirsiniz:

$ 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

VEYA göndermeden önce dönüştürmek / yeniden biçimlendirmek zorunda date!

Ayrıca bkz . Bugüne kadarki girdi için bir biçim nasıl belirlersiniz?


Ziyaret etmenizi öneririm: Tarih giriş formatları .

İşte kurallar.

Sayısal aylar için , yıl herhangi bir pozitif sayı, ay 01 ile 12 arasında ve gün 01 ile 31 arasında bir sayı olan ISO 8601 biçimine 'yıl-ay-gün' izin verilir. bir sayı ondan küçükse. Yıl 68 veya daha küçükse, ona 2000 eklenir; aksi takdirde, yıl 100'den azsa 1900 eklenir. ABD'de popüler olan 'ay / gün / yıl' yapısı kabul edilir. Ayrıca 'ay / gün', yılı ihmal ediyor.

Değişmez aylar tam olarak belirtilebilir: 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', ' Kasım 'veya' Aralık '. Değişmez aylar ilk üç harfine kısaltılabilir, ardından kısaltılmış bir nokta gelebilir. 'Eylül' yerine 'Eylül' yazmasına da izin verilmektedir.

Aylar tam olarak yazıldığında , takvim tarihi aşağıdakilerden herhangi biri olarak verilebilir:

 gün ay yıl
 gün ay
 ay gün yıl
 gün-ay-yıl

benim tarafımdan vurgulandı

Burada yıl-ay-gün gibi bir format olmadığını görebilirsiniz ! (aylarca kelimenin tam anlamıyla yazılır)


7

İle zshKullanabileceğin strftime(yoluyla ulaşılabilir yerleşiği zsh/datetimeile) -r(ters):

strftime -r biçiminde zamanlama

zamanlamayı ayrıştırmak ve çağdan bu yana geçen saniye sayısını çıkarmak için biçimi kullanır :

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

Tarih geçersizse bu hata oluşur:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: biçim eşleşmedi

Ayrıca dönemden bu yana geçen saniyeleri başka herhangi bir standart / özel tarih biçimine dönüştürebilirsiniz;

strftime '%A, %B %d, %Y' 1447970400
20 Kasım 2015 Cuma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.