使用SHELL BSD“date”命令转换为纳秒?

时间:2013-05-09 15:41:12

标签: macos shell unix

我需要将时间转换为纳秒,bsd date命令不合适,因为它可以返回的最佳值是秒。date +"%H:%M:%S"返回17:33:07 ..

似乎Mac的BSD日期版本和Linux GNU日期版本之间存在差异。最后一个可以返回纳秒。第一个可以......

我应该使用python或ruby脚本而不是shell吗?或者是否有其他解决方案可以在Mac上获得纳秒数?

实际上没有%N

2 个答案:

答案 0 :(得分:2)

OSX date命令不会执行nanonseconds,但在OSX中,您仍然可以从系统中获取此信息。

例如,在C中,这应该是系统正常运行时间:

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

#include <mach/mach_time.h>

int main(void)
{
        uint64_t t = mach_absolute_time();

        // Get ratio between mach_absolute_time units and nanoseconds.
        mach_timebase_info_data_t data;
        mach_timebase_info(&data);

        // Convert to nanoseconds.
        t *= data.numer;
        t /= data.denom;

        printf("%" PRIu64 "\n", t);

        return 0;
}

将其保存为类似uptimens.c的内容,然后从您的shell运行make uptimens

mac:~ ghoti$ ./uptimens
366181198555774
mac:~ ghoti$ 

答案 1 :(得分:1)

我使用--version选项的存在测试来区分mac的代码:

if ! date --version >/dev/null 2>&1; then # Mac
    micro=$(perl -e 'use Time::HiRes qw( gettimeofday ); my ($a, $b) = gettimeofday; print $b;')
else
    micro=$(($(date +%N) / 1000))
fi

gettimeofday的最佳准确度是微秒。