Com o GNU date
:
d=1456478048306
s=${d%???}
ms=${d#"$s"}
date -d "@$s" +"%F %T.$ms %z"
# or:
date -d "$s.$ms" '+%F %T.%3N %z'
com BSD date
:
date -r "$s" +"%F %T.$ms %z"
Com GNU awk
e versões recentes de mawk
(desde 1.3.4 20121129
):
echo 1456478048306 | awk '{
print strftime("%F %T." substr($0,length-2) " %z", substr($0, 1, length-3))}'
Para portabilidade, perl
pode ser sua melhor aposta:
echo 1456478048306 | perl -MPOSIX -lne '
print strftime "%F %T.$2 %z", localtime $1 if /(.+)(.{3})/'
Aqui, dou o meu formato preferido mais convencional e menos ambíguo:
2016-02-26 09:14:08.306 +0000
mas é claro, você pode ajustar o formato strftime
de acordo com sua preferência.