Jak lze převést časové razítko Epoch do formátu čitelného pro člověka na klientském počítači? Myslím, že existuje způsob, jak to udělat s datem, ale syntax mi uniká (jiné způsoby jsou vítány).
On * BSD:
date -r 1234567890
V systému Linux (konkrétně s GNU coreutils ≥5.3):
date -d @1234567890
U starších verzí GNU date) můžete vypočítat relativní rozdíl k epochě UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Pokud potřebujete přenositelnost, máte štěstí. Pouze čas, který můžete formátovat pomocí příkazu POSIX Shell (aniž byste provedli výpočet sami), je aktuální čas. V praxi je Perl často k dispozici:
Perl -le 'print scalar localtime $ARGV[0]' 1234567890
date -d @1190000000
Nahraďte 1190000000 svou epochou
$ echo 1190000000 | Perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
To se může hodit pro aplikace, které využívají epochy v logfiles:
$ 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)
Vlastní formát s GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Nebo s GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Propojené SO otázka: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Pokud je váš čas epochy v milisekundách namísto sekund, odstraňte poslední tři číslice a předejte jej date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
To poskytuje nesprávná data. Odstraňte poslední tři číslice.
$ 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.
S bash-4.2
Nebo vyšším:
printf '%(%F %T)T\n' 1234567890
(kde %F %T
je formát typu strftime()
-)
Tato syntaxe je inspirována ksh93
.
V ksh93
Je však argument považován za výraz data, kde jsou podporovány různé a těžko zdokumentované formáty.
Pro dobu Unixové epochy je syntaxe v ksh93
:
printf '%(%F %T)T\n' '#1234567890'
Zdá se však, že ksh93
Používá svůj vlastní algoritmus pro časové pásmo a může to udělat špatně. Například v Británii bylo letní období po celý rok v roce 1970, ale:
$ 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
Často používám dva:
$ Perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
a
$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
S zsh
můžete použít strftime
vestavěný:
strftime formát epocha Výstup data označeného epocha v formát specifikováno.
např.
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Pátek 13. února 2009
K dispozici je také dateconv
od dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Pátek 13. února 2009
mějte na paměti dateutils
výchozí nástroje UTC
(add -z your/timezone
V případě potřeby).
Můžete také použít malý program C pro tisk datetime ve formátu, který může Shell přímo analyzovat
#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;
}
používání:
#compile
clang -o Epoch2datetime main.c
#invoke
eval `./Epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Bez malého uzlu.js by to nebylo skutečné řešení:
Epoch2date(){
node -p "new Date($1)"
}
přidat to do ~/.bash_aliases
a ujistěte se, že jeho zdroj je v ~/.bashrc
s . ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Chcete-li získat uzel na vašem systému goto http://nvm.sh a spusťte příkaz curl. Nainstaluje správce verzí uzlů (nvm), který vám umožní přepínat verze uzlu.
Stačí zadat nvm ls-remote
a vyberte verzi pro nvm install <version>
.
V PowerShell :
(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")