Mám časové razítko v systému UNIX a chtěl bych získat formátované datum (jako výstup date
) odpovídající tomuto časovému razítku.
Moje dosavadní pokusy:
$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'
Chtěl bych mít možnost získat výstup jako:
$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
V systému Mac OS X a BSD:
$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21
s GNU základní nástroje) (musíte za to prohledat informační soubor):
$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21
Pomocí jednoho z nich přidejte -u
(standardní) možnost, nebo předat TZ=UTC0
proměnná prostředí, která má datum UTC (TZ=UTC0
definuje časové pásmo nazvané UTC
s offsetem 0 od UTC, zatímco chování pro TZ=UTC
(bez offsetu) je nespecifikováno (ačkoli u většiny systémů by se odkazovalo na systémově definované časové pásmo také nazývané UTC
s offsetem 0 od UTC)).
Tento Perl jednoplášťový leták to udělá:
$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
Po nějakém googlingu jsem našel způsob, jak to udělat pouze pomocí příkazu date
:
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
Se zabudovanými Shell:
zsh
(4.1.1 (2003) a vyšší):
$ zmodload zsh/datetime
$ TZ=UTC0 strftime %c 1282368345
Sat 21 Aug 2010 05:25:45 UTC
ksh93
(ksh93i
(2000) a vyšší):
$ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
Sat Aug 21 05:25:45 2010
bash
(4.2 (2010) a vyšší):
$ TZ=UTC0 printf '%(%c)T\n' 1282368345
Sat 21 Aug 2010 05:25:45 UTC
Ve všech těchto nahraďte %c
Formátem strftime()
, který chcete.
Odpověď na starou otázku, ale myslím, že by to mohlo být zlepšení, pokud by to někdo hledal. Tato funkce Bash funguje jak na Linuxu, tak na OS X. Netestoval jsem na žádných jiných BSD systémech. Jako argument této funkce předejte čas epochy a vytiskne formát času RFC-3339.
epochtorfc3339 ()
{
RFC3339_FORMAT="+%FT%T:::%z"
Epoch=$(echo [email protected] | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
if date --version >/dev/null 2>/dev/null; then
# Linux
date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${Epoch} seconds"
#date -d @${Epoch} --rfc-3339=seconds
else
# OS X/BSD
date -r ${Epoch} ${RFC3339_FORMAT}
fi
}
Na OSX mít UTC
date -r "1475737200" -u
Další elegantní příklad bohatého dědictví moderního Unixu. To je ve většině variant BSD skutečně možné:
$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010
(BTW se zdá, že váš příklad je vypnut o jednu sekundu)