Mám časové razítko UNIX a chtěl bych dostat 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
Odpovědět
V systémech 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 jádrovými nástroji GNU (k tomu je nutné prohlédnout informační soubor):
$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21
Buď přidejte možnost -u
(standardní), nebo předejte TZ=UTC0
proměnná prostředí, která má datum UTC (TZ=UTC0
definuje časové pásmo s názvem UTC
s posunem 0 od UTC zatímco chování TZ=UTC
(bez offsetu) je nespecifikováno (i když ve většině systémů by odkazovalo na systémově definovaný časové pásmo nazývané také UTC
s posunem 0 od UTC)).
Komentáře
Odpověď
Tato jednorázová linka Perl to udělá:
$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010
odpověď
Po nějakém googlení jsem našel způsob, jak to udělat pomocí date
:
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010
Komentáře
- Děkujeme za to. Doufal jsem, že ' d bude něco jednoduššího, takže zatím jen hlasování.
- další skvělý příklad toho, jak vás Google dělá hloupým. už nikdo nikdy nečte dokumentaci?
- @hop, podpora pro
date -d @xxx
byla přidána až v roce 2005 v coreutils 5.3. ' jak jste to předtím museli udělat. - @St é phaneChazelas: a) tato odpověď je z roku 2010 ab) proč to dělá omluvte googling před přečtením dokumentace? Pokud odpovíte od svého vlastního orgánu, můžete se omluvit, že uděláte takové chyby, ale pokud to přesto musíte vyhledat, podívejte se správně.
- @hop, jen jsem poukazoval na to, že to nebylo hloupá odpověď, prostě zastaralá.
Odpověď
S vestavěnými prostředími:
-
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 případech nahraďte %c
požadovaným formátem strftime()
.
Komentáře
- Máte odkaz na
bash
printf
řešení? - Nevadí, našel jsem ho v popisu
printf
v gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Odpověď
V systému OSX mít v UTC
date -r "1475737200" -u
Komentáře
- Děkuji. ' Upravil jsem to v přijaté odpovědi, aby byly informace snadněji dostupné.
Odpověď
Odpověď na starou otázku, ale domnívám se, že by to mohlo být zlepšení, pokud ji bude hledat někdo jiný. Tato funkce Bash funguje na Linuxu i OS X. Netestoval jsem na žádném jiném systému BSD. Předejte této době epochu jako argument a vytiskne formát času RFC-3339.
epochtorfc3339 () { RFC3339_FORMAT="+%FT%T:::%z" EPOCH=$(echo $@ | 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 }
Odpovědět
Další elegantní příklad bohatého dědictví moderního Unixu. To je skutečně možné u většiny variant BSD:
$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010
(Zdá se, že BTW je váš příklad o jednu sekundu vypnutý)
Komentáře
- ' nefunguje v systému Linux. Zdá se, že odpověď hop ' má správnou odpověď systému Linux. Děkuji, že jste na to upozornil, měl jsem podezření, že se něco takového stane, ' jsem to udělal 45 sekund.
info coreutils date
přečíst trochu opatrněji.date -r 1447264553943
výsledky vWed Dec 28 01:39:03 BRST 47831
, kdy ' s skutečně11/11/2015, 3:55:53 PM GMT-2:00
.