Yanıtlar:
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"
Aşağıdaki yöntemler date
iki 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
printf
ya sed
da "gereksiz" olduğunu cat
vs <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 date
toplu işlem gibi bir programa izin vermek demek istediğim gibi .. ör. Gilles 'Left-Pad-0 örneği, vs printf
Kabuktaki tarihler üzerinde çalışmanın bir yolu. date
Bileşenleri almak ve konum parametrelerini ( $1
, $2
vb.) 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 0
sekizlik 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 0
olduğ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}"
Belki artık önemli değil ama kendi randevularımı deneyebilirsin . Dakikaya yuvarlama (aşağı) dround
ve 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
dateutils.dround '2018-11-12 13:55' -15m
üretir 2018-11-12T13:15:00
değil 2018-11-12T13:45:00
.
/-15m
yani 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
Bazı mermiler harici bir çağrı yapmadan işi yapabilir date
komut :
ksh
a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
bash a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
zsh 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:
gawk 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 1
To0
). Ancak harici bir awk veya harici bir zsh modülünü yüklemek, arama tarihinin kendisi kadar yavaş olabilir:
gnu-tarih 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:
busybox-tarih 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 date
ve busybox date
yukarıda UTC kez yazdırılır. -u
Yerel 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'
Ç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/'
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