Bagaimana Anda menentukan format untuk input hingga saat ini?

19

Diberi tanggal dan waktu dalam format yang tidak dikenali oleh date, bagaimana saya bisa datemengenali tanggal dan waktu?

Sebagai contoh:

$ date -d "09SEP2012:23:58:46"
date: invalid date `09SEP2012:23:58:46'
$ date -d "09SEP2012:23:58:46" --magic-option "ddMMMYYY:hh:mm:ss"
Sun Sep  9 23:58:46 MDT 2012

Apakah --magic-optionada Jika tidak, apakah ada cara yang lebih elegan untuk menyelesaikan ini daripada menggunakan seduntuk mengubah input menjadi string tanggal yang terbentuk dengan baik?

Cory Klein
sumber
Lihat juga: Validasi tanggal di shell
don_crissti

Jawaban:

10

Tidak ada tanggal POSIX maupun GNU --magic-option. FreeBSD menyebutnya -f(dengan sintaksis yang mirip dengan datepenentu format output, bukan yang Anda usulkan).

Tanggal Anda sangat dekat untuk dikenali oleh tanggal GNU: yang diperlukan hanyalah mengganti titik dua yang memisahkan tanggal dari waktu dengan spasi.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
dan dengan format khusus? Satu-satunya cara untuk pergi adalah ekspresi reguler? ini mengerikan :-(
phil294
1
Anda tidak dapat menguraikan tanggal tanpa mengetahui sesuatu tentang formatnya, contoh klasiknya 01/02/03.
Gilles 'SO- stop being evil'
5

Saya menulis banyak alat ( dateutils ) yang menangani tanggal dan waktu dengan cara yang lebih ramah terhadap skrip. Opsi ajaib Anda ada --input-format|-i, misalnya:

dconv -i '%d%b%Y:%H:%M:%S' "09SEP2012:23:58:46"
=>
  2012-09-09T23:58:46

Meskipun dconvtidak secara langsung mendukung dateformat output (tidak memberikan TZatau apa pun di lingkungan), ada alat strptimedi dateutils yang mendukung penentu%Z format.

hroptatyr
sumber