Як перетворити часову позначку епохи в читаний для людини формат на кліпі? Я думаю, що є спосіб зробити це з датою, але синтаксис ухиляється від мене (інші способи вітаються).
Як перетворити часову позначку епохи в читаний для людини формат на кліпі? Я думаю, що є спосіб зробити це з датою, але синтаксис ухиляється від мене (інші способи вітаються).
Відповіді:
Увімкнено * 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
не посилався на це ...
$ 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); }'
Пов'язане питання ТА: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
З bash-4.2
або вище:
printf '%(%F %T)T\n' 1234567890
(Де %F %T
це strftime()
формат-типу)
Цей синтаксис натхненний 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 Виведіть дату, позначену 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")