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

#1 楼

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


评论


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

–理查德·汉森(Richard Hansen)
2012年2月1日在22:50

@在-d @ 1234567890中是什么意思?约会没有提及...

–克里斯·马克尔(Chris Markle)
13年1月14日在21:10



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

–吉尔斯'所以-不再是邪恶的'
13年1月14日在21:56

信息日期非常完整。自大纪元以来28.9秒的条目详细说明了@timestamp。

–user79743
16年2月10日在8:31

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

–伊万·奥盖(Ivan Ogai)
16年8月12日在13:08

#2 楼

date -d @1190000000用您的纪元替换1190000000

评论


假设是GNU日期。

–吉尔斯'所以-不再是邪恶的'
2010-10-11 18:14

这在HP-UX上不起作用。

–saulius2
20 Sep 3 '20 at 6:51

#3 楼

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


评论


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

–user79743
16年2月10日在8:35

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

– KnockTurnAl
16年2月10日在8:49

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

–user79743
16年2月10日在10:11

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

– Br.Bill
19年3月7日在21:09

这个答案节省了我很多时间。谢谢!

–董
20-2-16在22:37

#4 楼

$ echo 1190000000 | perl -pe 's/(\d+)/localtime()/e' 
Sun Sep 16 20:33:20 2007


对于那些在日志文件中使用纪元时间的应用程序来说,它可以派上用场:

$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime()/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)


#5 楼

使用bash-4.2或更高版本:

printf '%(%F %T)T\n' 1234567890


(其中%F %Tstrftime()类型的格式)

该语法源自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


评论


这实际上适用于HP-UX。谢谢!

–saulius2
20-09-3在7:18

#6 楼

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

评论


仅适用于GNU日期和GNU awk。 awk和nawk都不支持strftime。

–user14755
2014年7月28日,下午3:56

#7 楼

我经常使用的两个是:

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




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


#8 楼

使用zsh可以使用内置的strftime

strftime format epochtime

      Output the date denoted by epochtime in the format specified.


例如

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890


Friday, 13 Feb 2009



还有dateconv中的dateutils

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890


Friday, 13 Feb 2009


请记住dateutils工具默认为UTC(添加-z your/timezone如果需要)。

评论


HP-UX上似乎没有dateutils。

–saulius2
20 Sep 3 '20 at 7:10

#9 楼

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


评论


在HP-UX上不起作用:./a.out 1599099168 YEAR = 1901 MON = 03 DAY = 00 HOUR = 2130568304 MIN =

–saulius2
20-09-3在7:16



#10 楼

没有一点node.js就不是真正的解决方案:

epoch2date(){
    node -p "new Date()"
}


将其添加到~/.bash_aliases并确保其源于~/.bashrc并带有. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi


要在系统上获取节点,请转至http://nvm.sh并运行curl命令。它将安装节点版本管理器(nvm),使您可以切换节点的版本。只需键入nvm ls-remote并选择一个版本到nvm install <version>

评论


node.js是否可以在HP-UX上运行?似乎没有:github.com/playnodeconf/ama/issues/10#issuecomment-211250773

–saulius2
20年9月3日,下午6:55

#11 楼

在PowerShell中:

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


评论


此技术正在使用Microsoft .NET。 OP似乎没有在寻找MS解决方案。

–user2320464
19-09-20在20:40

审阅者:PowerShell在Linux上可用;-)。

–斯蒂芬·基特(Stephen Kitt)
19-10-23在13:04

@StephenKitt,但是PowerShell可以在HP-UX上运行吗?似乎没有:reddit.com/r/PowerShell/comments/8cx8dp/…。这是Unix。

–saulius2
20年9月3日在6:58

通过这种方式@ saulius2,Unix.SE的大部分内容都是无效的,因为可以在不适用的Unix系统中找到它。这是Unix&Linux Stack Exchange。

–斯蒂芬·基特(Stephen Kitt)
20 Sep 4'6:54



@StephenKitt,也许是这样,我没有对问题的质量进行任何研究。但是仅通过查看此页面的右侧,我就会看到其中三个正在询问特定的操作系统:unix.stackexchange.com/questions/86507/…unix.stackexchange.com/questions/96189/…unix.stackexchange。 com / questions / 434844 /…

–saulius2
20-09-5在6:15