YYYY-MM-DD format tanggal dalam skrip shell

1112

Saya mencoba menggunakan $(date)skrip bash shell saya, namun, saya ingin tanggal dalam YYYY-MM-DDformat.
Bagaimana saya mendapatkan ini?

Kapsh
sumber

Jawaban:

1832

Dalam bash (> = 4.2) lebih baik menggunakan formatter tanggal bawaan printf (bagian dari bash) daripada eksternal date(biasanya tanggal GNU).

Dengan demikian:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

Dalam bash (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

Format tanggal lain yang tersedia dapat dilihat dari halaman manual tanggal (untuk perintah khusus non-bash eksternal):

man date
Philip Fourie
sumber
4
Pada hari-hari pertama bulan ini saya mendapatkan "2012-07-1" yang bukan apa yang diminta OP.
DerMike
6
Ini bekerja untuk saya. Halaman manual menyarankan bahwa bulan pertama adalah 01, no 1 (Kel. 2012-07-01).
Bob Kuhar
31
DATE = $ (tanggal +% d-% m-% Y ""% H:% M:% S); Apa yang akhirnya saya lakukan.
JacopKane
5
Saya belum memeriksa seberapa banyak pintasan ini tersedia, tetapi dalam beberapa distribusi Anda dapat menggunakan +%F %Tpintasan +%Y-%m-%d %H:%M:%S. Perhatikan bahwa beberapa filesystem (batuk ** HFS) akan mengonversikannya :menjadi /, memberikan Anda sebuah string 2016-09-15 11/05/00yang membingungkan.
beporter
24
Sintaks yang lebih disukai dalam setiap shell yang mendukung POSIX dalam milenium ini adalah date=$(date)bukan date=`date`. Juga, jangan gunakan huruf besar untuk variabel pribadi Anda; nama variabel huruf besar dicadangkan untuk sistem.
tripleee
335

Mencoba: $(date +%F)

kwatford
sumber
12
Halaman manual untuk tanggal berbunyi:% F tanggal penuh; sama dengan% Y-% m-% d, jadi ini hanya notasi yang lebih ringkas untuk jawaban yang diterima.
Håvard Geithus
92

Anda dapat melakukan sesuatu seperti ini:

$ date +'%Y-%m-%d'
Batalkan
sumber
47

Anda sedang mencari format tanggal standar ISO 8601 , jadi jika Anda memiliki tanggal GNU (atau perintah tanggal yang lebih modern dari 1988) lakukan saja:$(date -I)

Orang abad pertengahan
sumber
9
Saya memiliki komputer Mac OS X (> 1988) baru-baru ini, dan date -Itidak berfungsi. Setelah menginstal GNU coreutils menggunakan brew (yang menggunakan awalan 'g') gdate -Iberhasil.
Joel Purra
3
Aneh. Saya tidak dapat menemukan -Iopsi yang didokumentasikan untuk GNU date, meskipun cukup yakin itu sepertinya setara dengan date +%F.
chepner
3
OS X umumnya merupakan gurun GPL v3, jadi mereka mungkin tidak memiliki tanggal pembaruan atau BASH baru-baru ini.
Indolering
20
date -d '1 hour ago' '+%Y-%m-%d'

Outputnya adalah 2015-06-14.

xu2mao
sumber
3
Salah karena beberapa alasan, jelas ini memberikan tanggal yang salah antara 00:00 dan 01:00, dan selain itu Anda diakhiri dengan a %.
Gerhard Burger
itu tidak benar. harus seperti kutipan tunggal yang jarang ini
Beyhan Gül
20
$(date +%F_%H-%M-%S)

dapat digunakan untuk menghapus titik dua (:) di antaranya

keluaran

2018-06-20_09-55-58
ahmettolga
sumber
19

Dengan Bash terbaru (versi ≥ 4.2), Anda dapat menggunakan builtin printfdengan pengubah format %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfjauh lebih cepat daripada datekarena itu adalah Bash builtin sedangkan dateperintah eksternal.

Selain itu, printf -v date ...lebih cepat daripada date=$(printf ...)karena tidak perlu forking subkulit.

wjandrea
sumber
4
Sebagai catatan di 2019, perintah ini sangat lebih cepat * daripada datejika Anda sudah menggunakan ini dari dalam skrip bash, karena tidak harus memuat pustaka tambahan. (* Saya mengukur pada server linux saya perbedaan kecepatan ~ 160x lebih dari 1000 iterasi)
timtj
@timtj Terima kasih telah menunjukkannya! Saya menambahkan beberapa catatan tentang kecepatan ke jawabannya.
wjandrea
1
Saya berharap saya bisa memberi +5 untuk komentar tentang printf -v datetidak mencari subkulit. Info yang sangat bagus !!
timtj
Biasanya saya menggunakan tanggal karena saya juga perlu kenaikan melalui beberapa tanggal. Bisakah printf melakukan aritmatika tanggal?
Merlin
1
@Merlin, kurasa tidak
wjandrea
8

Setiap kali saya memiliki tugas seperti ini saya akhirnya jatuh kembali ke

$ man strftime

untuk mengingatkan diri sendiri tentang semua kemungkinan.

arp
sumber
7

Jika Anda ingin tahun dalam format dua angka seperti 17 daripada 2017, lakukan hal berikut:

DATE=`date +%d-%m-%y`
Crt
sumber
6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Di sini x adalah tanggal sampel yang digunakan & contoh kemudian menampilkan kedua format data serta mendapatkan tanggal 10 menit lebih dari tanggal saat ini.

ankitbaldua
sumber
6

Saya menggunakan formulasi berikut:

TODAY=`date -I`
echo $TODAY

Lihat halaman manual untuk date, ada sejumlah opsi berguna lainnya:

man date
Luís de Sousa
sumber
5

Saya menggunakan $(date +"%Y-%m-%d") atau $(date +"%Y-%m-%d %T")dengan waktu dan jam.

Miguel
sumber
1

Anda dapat mengatur tanggal sebagai variabel lingkungan dan nantinya Anda dapat menggunakannya

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

atau

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
sumber