5

我有一个像 2013-04-29 08:17:58 这样的时间。我需要将其转换为纪元以来的秒数。请不要perl,我的操作系统是solaris。+%s 不起作用。nawk 'BEGIN{print srand()}' 将当前时间转换为秒,但不会将给定时间转换为秒。

谢谢

4

2 回答 2

5

这是一个不需要 perl 的 shell 函数:

function d2ts
{
    typeset d=$(echo "$@" | tr -d ':- ' | sed 's/..$/.&/')
    typeset t=$(mktemp) || return -1
    typeset s=$(touch -t $d $t 2>&1) || { rm $t ; return -1 ; }
    [ -n "$s" ] && { rm $t ; return -1 ; }
    truss -f -v 'lstat,lstat64' ls -d $t 2>&1 | nawk '/mt =/ {printf "%d\n",$10}'
    rm $t
}

$ d2ts 2013-04-29 08:17:58           
1367216278

请注意,返回值取决于您的时区。

$ TZ=GMT d2ts 2013-04-29 08:17:58
1367223478

这个怎么运作:

  • 第一行将参数转换为适合的格式touch(此处为“2013-04-29
  • 08:17:58”->“201304290817.58”)
  • 第二行创建一个临时文件
  • 第三行把刚刚创建的文件的修改时间改成需要的值
  • 如果设置时间失败,即如果提供的时间无效,则第四行中止函数
  • 第五行跟踪ls命令获取文件修改时间并将其打印为整数
  • 第六行删除临时文件
于 2013-09-18T16:02:18.723 回答
0

在 UNIX 上的 C/C++ 中,您可以直接转换:

struct tm tm;
time_t t;

tm.tm_isdst = -1;
if (strptime("2013-04-29 08:17:58", "%Y-%m-%d %H:%M:%S", &tm) != NULL) {
    t = mktime(tm);
}
cout << "seconds since epoch: " << t;

有关示例,请参见Opengroup 手册页strptime()

我钦佩 strace/touch 的巧妙和它背后的创造力。不过,好吧,只是不要在一个紧密的循环中这样做......

于 2013-10-08T12:20:42.577 回答