Bir kabuk betiğinde geçen ayın son gününün tarihini öğrenin


11

İşleme tarihine göre önceki ayın bitiş tarihini nasıl alabilirim?

Örnekler:

  • İşlem tarihi = 15jan2015
  • Beklenen tarih = 31dec2014,

  • İşlem tarihi = 10feb2015
  • Beklenen tarih = 31jan2015

Yanıtlar:


27

GNU ile date:

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

Bazı mermilerin tarih manipülasyonu için yerleşik desteği vardır:

İle ksh93:

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

İle 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

4

Bunu yapmanın birçok yolu var ; İşte bulduğum en basit olanı (burada GNU varsayalım date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
@stephane'nin cevabı daha açıktır ve bu, ayın ortasında atlanan / eklenen günlerin olduğu bazı garip yıllarda çalışmayacaktır. Evet bu oldu. bkz. youtube.com/watch?v=-5wpm-gesOY
ctrl-alt-delor

@richard, GNU tarih günü ofsetleri çalışma şekli (1 günlük ofset 24 saat ile aynı değildir), bence bu cevap ve benimki eşdeğer olmalı ve sadece bir ayın son gününü atlayacak zaman diliminde başarısız olmalıdır ( tipik olarak, bu gerçekleşirse, muhtemelen -12: 00'a 12:00 ofsetine (veya -13 ila 11 ...) geçmek için bazı pasifik adasında olurdu ...
Stéphane Chazelas

@Stephane diğer sorunlara işaret ettiğiniz için teşekkürler, zaman zor. Çözümünüzde, ay ortasının kaldırılması durumunda (bu gerçekleşti), 30. gün 30. gün olmadığından, 30'un çıkarılması sizi önceki ayın son gününe götürmeyecektir. Ayın 1. günü (garanti değil) varsa, bu neden işe yaramaz göremiyorum. Ancak bu demek olacağı anlamına gelmez.
ctrl-alt-delor

@richard, Bkz TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. Bir hata alıyorsunuz çünkü orada 2011-12-30 yoktu. Yani, gün ofseti takvim zamanında yapıldı. 2011-12-31 eksi 31 gün 2011-11-30 verir, çünkü 31 kapalı 31 alır. Geçerli saatten 31 * 24 * 60 * 60 * 60 saniye sürmez. İle karşılaştır TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'size, bu defa 29th, veren, tarih bunun 24 * 60 * 60 * 60 saniye önce oldu.
Stéphane Chazelas

2

BSD dateyardımcı programını kullanan Mac OS'de çalışan bir sürüm :

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

Argümanlar sırayla uygulanır. Bir tarihin bir argümandan diğerine aktarıldığını hayal edebilirsiniz. Örneğin:

  • Geçerli tarih ile başlayın ( date) -> 2017-03-06
  • Bu tarihi ayının 1. gününe ayarlayın ( -v1d) -> 2017-03-01
  • Bundan bir gün çıkar ( -v-1d)-> 2017-02-28
  • Tarihi biçimlendir ( +%d%b%Y) -> 28Şub.2017

Sen kullanarak aylar ileri veya geri herhangi bir sayıda ulaşabilir date -v-1m -v1d -v-1dyerine -1mileriye ay geriye doğru veya sayısı ile ( +1mistediğiniz).

Bu genel cevap. Bu soru özellikle başlangıç ​​tarihine göre tarihleri ​​soruyor. Mac OS / BSD tarih yardımcı programı, başlangıç ​​için bir tarih damgası sağlamanıza izin vermez, ancak her tarih öğesini ayrı ayrı ayarlayabilirsiniz:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Aralık2014


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.