【问题标题】:convert standard timestampt to epoch format using awk/nawk on Solaris在 Solaris 中使用 awk/awk 将标准时间戳转换为纪元格式
【发布时间】:2016-04-15 17:45:09
【问题描述】:

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

我用下面的代码试了一下。但是,有时返回值与正确值有 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

非常感谢

【问题讨论】:

  • 这个神奇的数字是什么? 719591
  • 它代表“1970 年 1 月 1 日”。如果我错了,请纠正我
  • 该日期的格林威治标准时间午夜是纪元时间0
  • @glennjackman 这是“0000 年 1 月 1 日”和 1970 年 1 月 1 日之间的天数。
  • 如果你愿意,你可以把这段代码翻译成awk:$time_utils:from_ctime

标签: awk timestamp solaris epoch nawk


【解决方案1】:

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

这里有两种方法可以在 Solaris 下实现您想要实现的目标。

使用touchtruss(为了好玩):

$ touch -t "03202009" file
$ truss -f -v 'lstat,lstat64' ls -d file 2>&1 | nawk '/mt =/ {printf "%d\n",$10}'
1458504540
$ ctime 1458504540
2016/03/20, 20:09:00

使用perl

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

【讨论】:

  • 感谢 jlliagre,您的解决方案效果很好。我很好奇是否可以使用 nawk “计算”时间戳?
  • 当然可以,但是很繁琐。如果您限制接受作为输入的日期范围,代码可能会相对简单。
猜你喜欢
  • 2021-01-01
  • 2011-12-19
  • 2016-01-21
  • 2018-11-29
  • 2011-10-12
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多