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?

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

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)


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'

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)


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.


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

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.


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.


7

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

DATE=`date +%d-%m-%y`

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.


6

Saya menggunakan formulasi berikut:

TODAY=`date -I`
echo $TODAY

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

man date

5

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


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} -------------"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.