Alguns shells conseguem fazer o trabalho sem chamar um comando date
externo:
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)))
Os três acima fornecem tempo local (não UTC). Use um TZ principal = UTC0, se necessário.
A sintaxe do ksh e do bash é quase idêntica (exceto para o #
requerido no ksh). O zsh requer para carregar um módulo (incluído na distribuição zsh).
Também é possível fazer isso com o (GNU) awk:
gawk awk 'BEGIN{t=systime();print strftime("%Y.%m.%d %H:%M",t-t%(15*60),1)}'
Isso fornece um resultado UTC (altere a última 1
para 0
) se local for necessário.
Mas carregar um awk externo ou um módulo zsh externo pode ser tão lento quanto a própria data de chamada:
gnu-date a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
Um pequeno executável como busybox
poderia fornecer resultados semelhantes:
data do busybox a=$(busybox date +%s);busybox date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
Observe que a palavra busybox principal pode ser omitida se o busybox estiver vinculado a esses nomes em um diretório do PATH.
Tanto date
como busybox date
acima imprimem as horas UTC. Remova a opção -u
para os horários locais.
Se o seu sistema operacional tiver uma versão de data mais limitada (e é isso que você deve usar), tente:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -d"1970-01-01 $a seconds UTC" +'%Y.%m.%d %H:%M'
Ou, se estiver no FreeBSD, tente:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -r "$a" +'%Y.%m.%d %H:%M'