我有一个像 2013-04-29 08:17:58 这样的时间。我需要将其转换为纪元以来的秒数。请不要perl,我的操作系统是solaris。+%s 不起作用。nawk 'BEGIN{print srand()}' 将当前时间转换为秒,但不会将给定时间转换为秒。
谢谢
这是一个不需要 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 ls
命令获取文件修改时间并将其打印为整数在 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 的巧妙和它背后的创造力。不过,好吧,只是不要在一个紧密的循环中这样做......