Как я могу преобразовать метку времени эпохи в читаемый человеком формат на компьютере? Я думаю, что есть способ сделать это с датой, но синтаксис ускользает от меня (другие способы приветствуются).
Как я могу преобразовать метку времени эпохи в читаемый человеком формат на компьютере? Я думаю, что есть способ сделать это с датой, но синтаксис ускользает от меня (другие способы приветствуются).
Ответы:
На * BSD:
date -r 1234567890
В Linux (в частности, с GNU coreutils ≥5.3):
date -d @1234567890
В более старых версиях даты GNU вы можете рассчитать относительную разницу к эпохе UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Если вам нужна мобильность, вам не повезло. Единственное время, которое вы можете отформатировать с помощью командной строки POSIX (без самостоятельных вычислений), - это текущее время. На практике Perl часто доступен:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
@
значит в date -d @1234567890
? man date
не упомянул об этом ...
info date
вполне завершено. Запись 28.9 Seconds since the Epoch
в подробно объясняет о @timestamp.
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Это может пригодиться для тех приложений, которые используют время эпохи в лог-файлах:
$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)
Пользовательский формат с GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Или с GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Связанный вопрос SO: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
С bash-4.2
или выше:
printf '%(%F %T)T\n' 1234567890
(где %F %T
находится strftime()
формат -type)
Этот синтаксис вдохновлен ksh93
.
В ksh93
однако, аргумент воспринимается как выражение даты , когда различные и вряд ли документированные форматы поддерживаются.
Для времени эпохи Unix синтаксис ksh93
:
printf '%(%F %T)T\n' '#1234567890'
ksh93
однако, похоже, использует свой собственный алгоритм для часового пояса и может ошибиться. Например, в Британии летом 1970 года было все лето, но:
$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan 1 00:00:00 1970
Если время вашей эпохи указано в миллисекундах, а не в секундах, удалите последние три цифры, прежде чем передавать их date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Это дает неверные данные. Удалите последние три цифры.
$ date -d @1455086371
Tue Feb 9 22:39:31 PST 2016 #Correct after removing the last three digits. You may remove and round off the last digit too.
С помощью zsh
вы можете использовать strftime
встроенный:
формат strftime эпоха Выведите дату, обозначенную epochtime, в указанном формате .
например
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Пятница, 13 февраля 2009 г.
Там также dateconv
из dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Пятница, 13 февраля 2009 г.
имейте в виду, что dateutils
инструменты по умолчанию UTC
(добавить, -z your/timezone
если необходимо).
Вы также можете использовать небольшую программу на C для печати даты и времени в формате, который может быть непосредственно проанализирован оболочкой
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char * argv[]) {
if (argc==1) {
return 1;
}
struct tm input_tm;
char * formatStr = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
size_t formatSize = strlen(formatStr) + 2;
char * output = (char *)malloc(sizeof(char)*formatSize);
strptime(argv[1],"%s",&input_tm);
strftime(output, formatSize, formatStr, &input_tm);
printf("%s\n",output);
free(output);
return 0;
}
использование:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Не было бы реального решения без небольшого node.js:
epoch2date(){
node -p "new Date($1)"
}
добавить это ~/.bash_aliases
и убедиться, что его источником ~/.bashrc
с. ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Чтобы получить узел в вашей системе, перейдите на страницу http://nvm.sh и выполните команду curl. Он установит менеджер версий узлов (nvm), который позволяет переключать версии узлов.
Просто введите nvm ls-remote
и выберите версию для nvm install <version>
.
Есть более простой способ сделать это: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")