在Solaris上使用awk/nawk将标准时间戳转换为历元格式

在Solaris上使用awk/nawk将标准时间戳转换为历元格式,awk,timestamp,solaris,epoch,nawk,Awk,Timestamp,Solaris,Epoch,Nawk,我需要在没有安装任何GNU的情况下将Solaris上的一些时间戳转换为epoch格式 我用下面的代码试了一下。但是,有时返回值偏离正确值1-2天 echo "Mar 20 20:09" | nawk -v FS="[: ]+" 'BEGIN { month_array["Jan"]="01"; month_array["Feb"]="02"; month_array["Mar"]="03"; month_array["Apr"]="04"; month_a

我需要在没有安装任何GNU的情况下将Solaris上的一些时间戳转换为epoch格式

我用下面的代码试了一下。但是,有时返回值偏离正确值1-2天

echo "Mar 20 20:09" | nawk -v FS="[: ]+" 'BEGIN {
    month_array["Jan"]="01";
    month_array["Feb"]="02";
    month_array["Mar"]="03";
    month_array["Apr"]="04";
    month_array["May"]="05";
    month_array["Jun"]="06";
    month_array["Jul"]="07";
    month_array["Aug"]="08";
    month_array["Sep"]="09";
    month_array["Oct"]="10";
    month_array["Nov"]="11";
    month_array["Dec"]="12";
}
{
    year=2016;
    month=month_array[$1];
    day=$2; hour=$3; minute=$4;
    if (month > 2) {
        month=month+1;
    } else {
        month=month+13; year=year-1;
    }

    day=(year*365)+(year/4)-(year/100)+(year/400)+(month*306001/10000)+day;
    days_since_epoch=day-719591;
    seconds_since_epoch=(days_since_epoch*86400)+(hour*3600)+(minute*60);
    printf "%d\n", seconds_since_epoch;
}'
1458677340

bash-3.2$ ctime 1458677340
Tue Mar 22 20:09:00 2016

非常感谢

假设一个月有30.6天显然是注定的

这里有两种方法可以实现您希望在Solaris下实现的目标

使用
触摸
桁架
(为了好玩):

使用
perl

$ touch -t "03202009" file
$ perl -sle '@stat=stat($filename); print "$stat[8]"' -- -filename=file
1458504540

这个神奇的数字是什么<代码>719591它代表“1970年1月1日”。如果我错了,请纠正我该日期的午夜GMT是大纪元时间
0
@glennjackman这是从“10000年1月1日”到1970年1月1日之间的天数。如果您愿意,您可以将此代码转换为awk:谢谢jlliagre,您的解决方案非常有效。我很好奇,是否可以用nawk来“计算”时间戳?这当然是可能的,但很乏味。如果您限制接受为输入的日期范围,代码可能会相对简单。
$ touch -t "03202009" file
$ perl -sle '@stat=stat($filename); print "$stat[8]"' -- -filename=file
1458504540