在solaris中将给定时间转换为秒

时间:2013-09-18 09:41:58

标签: bash shell solaris

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

由于

2 个答案:

答案 0 :(得分: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命令以获取文件修改时间并将其打印为整数
  • 第六行删除临时文件

答案 1 :(得分: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 manpage strptime()

我很欣赏它背后的触感和触感。虽然,好吧,只是不要紧紧地做这个......