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


60

У меня есть отметка времени 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

Ответы:


93

В 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)).


1
Однако требуется много копать, что удивительно для такой распространенной задачи.
Дэвид Z

Спасибо, принял ваш ответ. Я должен был прочитать info coreutils dateнемного более внимательно.
Уманг

Это дает мне немного другую дату: date -r 1447264553943результаты Wed Dec 28 01:39:03 BRST 47831, когда это на самом деле 11/11/2015, 3:55:53 PM GMT-2:00.
фальш

1
@falmp: это будет работать, если вы используете секунды, а не микросекунды.

@hop ops, следовало бы рассчитать с 47831 годом, но это число было настолько высоким, что я его пропустил. Спасибо!
Falmp

6

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

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

Спасибо за это. Я надеялся, что будет что-то попроще, так что пока просто голосование.
Уманг

Еще один отличный пример того, как Google делает тебя глупым. никто больше не читает документацию?

1
@hop, поддержка date -d @xxxне была добавлена ​​до Coreutils 5.3 в 2005 году. Вот как вы должны были сделать это до этого.
Стефан Шазелас

@ StéphaneChazelas: а) этот ответ с 2010 года и б) почему это оправдание поиску в Google перед чтением документации? Если вы отвечаете от своего собственного имени, вы можете извинить, что делали такие ошибки, но если вам все равно придется это искать, ищите это правильно.

@hop, я просто указывал, что это был не глупый ответ, а просто устаревший.
Стефан Шазелас

6

Этот perl one-liner сделает это:

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

5

Встроенные оболочки:

  • 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()форматом вы хотите.


У вас есть ссылка на bash printfрешение?
Дерек Махар

Неважно, я нашел это в описании printfв gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Дерек Махар


1

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

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

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


Не работает на Linux. Кажется, у хмелевого ответа правильный ответ для Linux. Спасибо за указание на это, я подозревал, что что-то подобное произойдет, я сделал это 45 секунд сейчас.
Уманг

1

Ответьте на старый вопрос, но я думаю, что это может быть улучшение, если кто-то еще ищет это. Эта функция Bash работает как в Linux, так и в OS X. Я не тестировал ни на каких других системах BSD. Передайте время эпохи в качестве аргумента этой функции, и она напечатает формат времени 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
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.