tarih: güncel 15 dakika aralığını al


15

Tarih komutunu veya benzerini kullanarak geçerli 15 dakikalık aralığı almamın bir yolu var mı?

tarih gibi mesela şey %Y.%m.%d %H:%M beni verecektir 2011.02.22 10:19bir şeye ihtiyacım olduğunu verimleri 2011.02.22 10:15olan zaman dilimi içinde 10:15için 10:29.

Yanıtlar:


17

Geçerli unix zaman damgasını alabilir, geçerli date "+%s"çeyrek saati basit bir matematikle (örneğim var bash) bulabilir ve daha iyi bir formatla tekrar yazdırabilirsiniz date:

curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"

@Sizin OS üzerinde çalışan yoksa bir zaman damgası güncel tarih ve saati ayarlamak için sözdizimi, bugüne kadar bir GNU uzantısıdır, aksi halde, bu gibi aynı (UTC belirtmek unutmayın yapabilir, bu kazandı t iş):

date -d"1970-01-01 $curquarter seconds UTC"

5

Aşağıdaki yöntemler dateiki kez aramayı gereksiz kılar .
Bir sistem çağrısının yükü, aynı şeyi kendi yerel ortamında yapmaktan bash'den 100 kat daha yavaş "basit" bir komut verebilir.

GÜNCELLEME Yukarıdaki yorumum hakkında kısa bir açıklama: "100 kat daha yavaş". Şimdi " 500 kat daha yavaş" okuyabilir ... Ben son zamanlarda bu konuya (hayır, körü körüne yürüdü) düştü. link: Bir test dosyası oluşturmanın hızlı yolu

eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00  
echo $Y.$m.$d $H:$M  

veya

eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
if   [[ "$M" < "15" ]] ; then M=00
elif [[ "$M" < "30" ]] ; then M=15
elif [[ "$M" < "45" ]] ; then M=30
else M=45
fi
echo $Y.$m.$d $H:$M

Her iki sürüm de yalnızca

2011.02.23 01:00
2011.02.23 01:15
2011.02.23 01:30
2011.02.23 01:45   

İşte 60 değerin tümü için TEST döngüsüne sahip ilk {{00..59}

for X in {00..59} ;                         ###### TEST
do                                          ###### TEST 
  eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
  M=$X                                      ###### TEST 
  [[ "$M" < "15" ]] && M=00 # cater for octal clash
  M=$(((M/15)*15))
  ((M==0)) && M=00 # the math returns 0, so make it 00  
  echo $Y.$m.$d $H:$M 
done                                        ###### TEST 

1
Sadece açıklama için - "sistem çağrısı" ile, genel olarak sistem çağrısını değil, "fork / exec / wait (sistem () çağrısı" gibi) anlamına gelir . (Kullanıcı / çekirdek anahtarı nedeniyle sistem çağrısı yapmanın da bir yükü olduğu için bunu
belirtiyorum

mattdm ... Teşekkürler .. Sadece 6 aylık Linux deneyiminden çalışıyorum, bu yüzden muhtemelen yanlış ifadeyi kullandım, ancak gereksiz çağrıların neden olduğu genel giderleri ve kendi deneyimlerimi test etmeye devam ediyorum çağırarak nerede komut, ben pek çok örnek gördüm printfya sedda "gereksiz" olduğunu catvs <dosya dramatik gerçek çalışma zamanı fark yaratır. Döngü yaparken, benim "500 kat daha yavaş" örneğimde olduğu gibi .. Yani mümkün olduğunca kabuk kullanarak ve datetoplu işlem gibi bir programa izin vermek demek istediğim gibi .. ör. Gilles 'Left-Pad-0 örneği, vs printf
Peter.O

3

Kabuktaki tarihler üzerinde çalışmanın bir yolu. dateBileşenleri almak ve konum parametrelerini ( $1, $2vb.) Bileşenlerle doldurmak için ilk çağrı ( $(…)dizenin kelimelere bölünmesi için bunun çift tırnak dışında kullanmak istediğiniz bu nadir durumlardan biri olduğunu unutmayın ). Ardından, aritmetikler, testler veya bileşenler üzerinde ne yapmanız gerekiyorsa yapın. Sonunda bileşenleri monte edin.

Aritmetik kısım biraz zor olabilir çünkü kabuklar 0sekizlik bir önek olarak davranır ; örneğin burada $(($5/15))saat 8 veya 9 dakika sonra başarısız olur. En fazla bir lider 0olduğundan ${5#0}, aritmetik için güvenlidir. 100 eklenmesi ve ardından sıyırma işlemi 1, çıktıda sabit sayıda basamak elde etmenin bir yoludur.

set $(date "+%Y %m %d %H %M")
m=$((100+15*(${5#0}/15)))
last_quarter_hour="$1.$2.$3 $4:${m#1}"

"Ticaretin püf noktaları" ... iyi bir ticaret. :)
Peter.O

2

Belki artık önemli değil ama kendi randevularımı deneyebilirsin . Dakikaya yuvarlama (aşağı) droundve negatif bir argüman ile yapılır :

dround now /-15m
=>
  2012-07-11T13:00:00

Veya biçiminize uymak için:

dround now /-15m -f '%Y.%m.%d %H:%M'
=>
  2012.07.11 13:00

aslında aletleriniz artık böyle mi çalışıyor? Bir saat geçmiş en yakın 15 dakikaya giriş geri alınabilirken olsun -15m kullanarak: dateutils.dround '2018-11-12 13:55' -15müretir 2018-11-12T13:15:00değil 2018-11-12T13:45:00.

1
@JackDouglas Araçlar gelişti, şimdi istediğiniz şey: /-15myani saatteki 15 dakikalık bir sonraki katına yuvarlayın. Bu özellik, daha az değer kabul ettiği için daha hantal bir sözdizimi aldı, / -13m, örneğin, 60'ın (saatte dakika) bir divizörü olmadığı için mümkün değil
hroptatyr 13:18

güzel, şimdi ihtiyacım olanı aldım dateutils.dround '2018-11-12 12:52:31' /450s /-15m, teşekkürler!

2

Bazı mermiler harici bir çağrı yapmadan işi yapabilir date komut :

a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
zmodload zsh/datetime; a=$EPOCHSECONDS; strftime '%Y-%m-%d %H:%M' $((a-a%(15*60)))

Yukarıdaki üçü yerel (UTC değil) zaman sağlar. Gerekirse önde gelen bir TZ = UTC0 kullanın.

Ksh ve bash sözdizimi neredeyse aynıdır (gerekli olanlar hariç) # ksh ). Zsh bir modül yüklemelidir (zsh dağıtımına dahildir).

Bunu (GNU) awk ile yapmak da mümkündür:

awk 'BEGIN{t=systime();print strftime("%Y.%m.%d %H:%M",t-t%(15*60),1)}'

Bu, bir UTC sonucu (son değişiklik sağlamak 1To0 ). Ancak harici bir awk veya harici bir zsh modülünü yüklemek, arama tarihinin kendisi kadar yavaş olabilir:

a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'

Gibi küçük bir çalıştırılabilir busybox benzer sonuçlar sağlayabilir:

a=$(busybox date +%s);busybox date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'

Meşgul kutusu PATH dizinindeki bu adlara bağlanırsa, önde gelen meşgul kutusu sözcüğünün atlanabileceğini unutmayın.

Hem dateve busybox dateyukarıda UTC kez yazdırılır. -uYerel zamanlar seçeneğini kaldırın .


İşletim sisteminizin daha sınırlı bir tarih sürümü varsa (ve kullanmanız gereken şey buysa), şunu deneyin:

a=$(date +%s); a=$(( a-a%(15*60) ))
date -d"1970-01-01 $a seconds UTC" +'%Y.%m.%d %H:%M'

Veya, FreeBSD'deyse, deneyin:

a=$(date +%s); a=$(( a-a%(15*60) ))
date -r "$a" +'%Y.%m.%d %H:%M'

1

Çağrı tarihiyle iki kez yaşayabilirseniz, bu Solaris'te bash'de çalışır:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))"

Yorum adına şunlar için düzenlendi:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))" | sed 's/:0$/:00/'

1
Saatin ilk çeyreğinde, bu 00 yerine sadece tek bir 0 ile dakika çıktısı üretecektir
Peter.O

Düzeltildi, orijinal komuttan sonra basit bir sed.
ddeimeke

Bir hata daha: H: 08 ve H: 10 arasında çalışmıyor. Neden ve bir düzeltme için cevabımı görün .
Gilles 'SO- kötü olmayı kes'

-1

Tam gereksiniminizden emin değilim. Ancak, 15 dakika sonra zaman oluşturmak istiyorsanız, o zaman gibi bir şey kullanabilirsiniz date -d '+15 min'. Çıktı aşağıda gösterilmiştir:

$ date; date  -d '+15 min'
Tue Feb 22 18:12:39 IST 2011
Tue Feb 22 18:27:39 IST 2011

1
Soruyu yanlış anladınız. Buradaki nokta, tarihi (aşağı) 15 dakikanın katlarına yuvarlamaktır.
Gilles 'SO- kötü olmayı bırak'
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.