Jak mohu získat formátované datum pro časové razítko UNIX z příkazového řádku

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

  • Vyžaduje to hodně kopání, což je pro tak běžný úkol překvapivé.
  • Díky, přijal jsem vaši odpověď. Měl jsem si info coreutils date přečíst trochu opatrněji.
  • Toto mi dává trochu jiné datum: date -r 1447264553943 výsledky v Wed Dec 28 01:39:03 BRST 47831, kdy ' s skutečně 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: bude to fungovat, pokud místo mikrosekund použijete sekundy.
  • @hop ops, měl jsem počítat s tím, že rok bude 47831, ale to číslo bylo tak vysoké, že mi to chybělo. Děkujeme!

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

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *