it-swarm-eu.dev

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

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
63
Umang

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=UTC0definuje č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)).

98
user601

Tento Perl jednoplášťový leták to udělá:

$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
6
AlexD

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
6
AlexD

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.

5

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
}
2
Noah Spurrier

Na OSX mít UTC

date -r "1475737200" -u
2
anyone

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)

1
codehead