it-swarm-ru.tech

Как я могу получить отформатированную дату для отметки времени UNIX из командной строки

У меня есть отметка времени UNIX, и я хотел бы получить отформатированную дату (например, вывод date), соответствующую этой отметке времени.

Мои попытки пока:

$ 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'

Я хотел бы иметь возможность получить вывод, как:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
63
Umang

В Mac OS X и BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

с GNU основными инструментами (для этого вам нужно покопаться в информационном файле):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

С любой, добавьте -u (стандартная) опция или передайте TZ=UTC0 переменная среды с датой UTC (TZ=UTC0определяет часовой пояс с именем UTC со смещением 0 от UTC при поведении TZ=UTC (без смещения) не определено (хотя в большинстве систем используется системный часовой пояс, также называемый UTC со смещением 0 от UTC)).

98
user601

Этот Perl-однострочник сделает это:

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

После некоторого поиска в Google я нашел способ сделать это только с помощью команды date:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
6
AlexD

С помощью встроенных команд Shell:

  • zsh (4.1.1 (2003) и выше):

    _$ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    _
  • _ksh93_ (_ksh93i_ (2000) и выше):

    _$ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    _
  • bash (4.2 (2010) и выше):

    _$ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    _

Во всех этих случаях замените _%c_ желаемым форматом strftime().

5
Stéphane Chazelas

Ответьте на старый вопрос, но я думаю, что это может быть улучшение, если кто-то еще ищет это. Эта функция Bash работает как в Linux, так и в OS X. Я не тестировал ни на каких других системах BSD. Передайте время Epoch в качестве аргумента этой функции, и она напечатает формат времени 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

На osx, чтобы иметь в UTC

date -r "1475737200" -u
2
anyone

Еще один прекрасный пример богатого наследия современного Unix. Это действительно возможно при большинстве вариантов BSD:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(Кстати, ваш пример, кажется, выключен на одну секунду)

1
codehead