it-swarm.cn

如何在cli上将纪元时间戳转换为人类可读的格式?

如何在cli上将纪元时间戳转换为人类可读的格式?我认为有一种处理日期的方法,但是语法使我难以理解(欢迎使用其他方法)。

196
xenoterracide

在* BSD上:

date -r 1234567890

在Linux上(特别是GNU coreutils≥5.3)):

date -d @1234567890

使用GNU date)的较旧版本,您可以计算与UTC纪元的相对差:

date -d '1970-01-01 UTC + 1234567890 seconds'

如果您需要可移植性,那您就不走运了。您只能使用POSIX Shell命令(无需自己进行计算)进行格式化的时间就是当前时间。实际上,通常可以使用Perl:

Perl -le 'print scalar localtime $ARGV[0]' 1234567890
296

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
Stefan Lasiewski

使用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

如果您的纪元时间是毫秒而不是秒,请先删除最后三位数,再将其传递给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.
12
KnockTurnAl

_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
_
11
Stéphane Chazelas

我经常使用的两个是:

$ 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程序以Shell可以直接解析的格式打印日期时间

#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