Dapatkan tanggal hari terakhir bulan lalu dalam skrip shell

11

Bagaimana saya mendapatkan tanggal akhir bulan sebelumnya, berdasarkan tanggal pemrosesan?

Contoh:

  • Tanggal pemrosesan = 15jan2015
  • Tanggal yang diharapkan = 31dec2014,

  • Tanggal pemrosesan = 10feb2015
  • Tanggal yang diharapkan = 31jan2015
pengguna128856
sumber

Jawaban:

27

Dengan GNU date:

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

Beberapa shell memiliki dukungan bawaan untuk manipulasi tanggal:

Dengan ksh93:

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

Dengan zsh:

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015
Stéphane Chazelas
sumber
4

Ada banyak cara untuk melakukan ini; di sini adalah yang paling sederhana yang saya temukan (di sini dengan asumsi GNU date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
pengguna1717828
sumber
1
Jawaban @stephane lebih jelas, dan yang ini tidak akan bekerja di beberapa tahun yang aneh, di mana hari-hari dilewati / ditambahkan pada pertengahan bulan. Ya ini telah terjadi. lihat youtube.com/watch?v=-5wpm-gesOY
ctrl-alt-delor
@ Richard, cara kerja offset hari tanggal GNU ( offset 1 hari tidak sama dengan 24 jam), saya pikir jawaban ini dan milik saya harus sama dan hanya gagal di zona waktu yang akan melewati hari terakhir satu bulan ( biasanya, jika itu pernah terjadi yang mungkin akan ada di beberapa pulau pasifik untuk beralih ke -12: 00 offset ke 12:00 offset (atau -13 ke 11 ...) ...
Stéphane Chazelas
@Sthane terima kasih telah menunjukkan masalah lain, waktunya sulit. Perhatikan dalam solusi Anda, jika pertengahan bulan dihapus (ini telah terjadi) maka hari 30 bukan hari ke-30, jadi mengurangi 30 tidak akan membawa Anda ke hari terakhir bulan sebelumnya. Saya tidak bisa melihat mengapa yang ini tidak berfungsi, jika ada hari pertama dalam sebulan (tidak dijamin). Namun ini tidak berarti bahwa itu akan terjadi.
ctrl-alt-delor
@ Richard, Lihat TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. Anda mendapatkan kesalahan karena tidak ada 2011-12-30 di sana. Artinya, hari offset dilakukan pada waktu kalender. 2011-12-31 dikurangi 31 hari memberi Anda 2011-11-30 karena mengambil 31 dari 31. Tidak mengambil 31 * 24 * 60 * 60 * 60 detik dari waktu saat ini. Bandingkan dengan TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'yang memberi Anda tanggal 29, yaitu, kali ini, tanggal 24 * 60 * 60 * 60 detik yang lalu.
Stéphane Chazelas
2

Berikut adalah versi yang berfungsi di Mac OS, yang menggunakan dateutilitas BSD :

date -v1d -v-1d +%d%b%Y

Argumen diterapkan secara berurutan. Anda dapat membayangkan bahwa suatu kencan disalurkan dari satu argumen ke argumen berikutnya. Sebagai contoh:

  • Mulai dengan tanggal saat ini ( date) -> 2017-03-06
  • Tetapkan tanggal itu ke hari pertama di bulannya ( -v1d) -> 2017-03-01
  • Kurangi satu hari dari itu ( -v-1d)-> 2017-02-28
  • Format tanggal ( +%d%b%Y) -> 28Feb2017

Anda dapat mencapai jumlah bulan maju atau mundur menggunakan date -v-1m -v1d -v-1d, menggantikan -1mdengan jumlah bulan mundur atau maju ( +1m) yang Anda inginkan.

Itulah jawaban umum. Pertanyaan ini secara khusus menanyakan tentang tanggal relatif terhadap tanggal mulai. Utilitas tanggal Mac OS / BSD tidak memungkinkan Anda menyediakan datestamp untuk memulai, tetapi Anda dapat mengatur setiap elemen tanggal secara individual:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Dec2014

spiffytech
sumber
0

Coba gunakan kode ini

date -d "-$(date +%d) days  month" +%Y-%m-%d
Berjalan
sumber
Itu memberi hari terakhir bulan ini .
Warren Young