web-dev-qa-db-ja.com

エポックのタイムスタンプをCLIで人間が読める形式に変換するにはどうすればよいですか?

エポックのタイムスタンプをCLIで人間が読める形式に変換するにはどうすればよいですか?私は日付でそれを行う方法があると思いますが、構文は私を逃れます(他の方法は歓迎します)。

196
xenoterracide

* 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 @1190000000 1190000000をあなたのエポックに置き換えます

28
fschmitt
$ 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)
14

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

12
Ivan Chau

エポック時間が秒ではなくミリ秒単位の場合は、最後の3桁を削除してからdate -dに渡します。

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

これは誤ったデータを与えます。下3桁を削除します。

$ 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.
12
KnockTurnAl

_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
_
11

私が頻繁に使用する2つは次のとおりです。

$ Perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

そして

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
7
al.

zshを使用すると、 strftime 組み込みを使用できます。

strftime エポックタイムのフォーマット
 
で示される日付を出力します エポックタイム の中に フォーマット 指定。

例えば.

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
2009年2月13日金曜日

dateconv からのdateutilsもあります:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
2009年2月13日金曜日

dateutilsツールのデフォルトはUTCであることに注意してください(追加-z your/timezone 必要に応じて)。

7
don_crissti

小さな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
0
Meow

少しの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>のバージョンを選択するだけです。

0
chovy

PowerShell で:

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
0
Kulwinder Singh