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


183

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

Answers:


268

在* 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

4
对于缺乏可移植性的评论+1(为什么POSIX规范不包含这样做的方法?grr)
Richard Hansen

3
是什么@意思date -d @1234567890man date没有提到这个...
克里斯·马克

10
@ChrisMarkle GNU手册页通常非常不完整。“日期字符串格式比这里容易记录的要复杂,但是在信息文档中有完整描述。”机智:gnu.org/software/coreutils/manual/html_node/…–
Gilles

2
info date是相当齐全。的条目28.9 Seconds since the Epoch详细说明了@timestamp。

在管道中的Linux中:date +'%s'| xargs -I n date -d @n
Ivan Ogai


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


11

具有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

7

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

哪些实用程序打印的时间包括毫秒(无点)?

我已经看到,使用脚本工具时,WebLogic Application Server大多数返回的数据时间值为毫秒,没有点。例如,lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

我懂了。此页面确认Raw Time Value时间戳(以毫秒为单位)。谢谢。

Atlassian工具将其时间戳记为以毫秒为单位的纪元时间。
Br.Bill

6

我经常使用的两个是:

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

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

6

有了zsh您可以使用strftime内置的:

strftime 格式epochtime
以指定的格式 
      输出以epochtime表示的日期。

例如

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如有需要,请添加)。


0

您还可以使用一些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

没有一点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

有一种更简单的方法可以做到这一点:(([[System.DateTimeOffset] :: FromUnixTimeMilliSeconds($ unixtime))。DateTime).ToString(“ s”)


欢迎使用U&L!请看一下问题的标签:该代码在某些Unix或类Unix系统上的某些shell中起作用吗?
fra-san

此技术正在使用Microsoft .NET。OP似乎没有在寻找MS解决方案。
user2320464
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.