【问题标题】:Getting current second with millisecond precision in OCaml在 OCaml 中以毫秒精度获取当前秒
【发布时间】:2023-03-06 22:04:01
【问题描述】:

我想以毫秒精度获取当前的秒数。有效值可以是:23.43251.027 等,整数部分在 1-60(分钟中的秒)范围内,小数部分为毫秒 (0-999)。

我发现标准库可以通过执行以下操作为我提供秒数:

let t = Unix.localtime (Unix.time ())
Printf.printf "Current seconds value %02d\n" t.tm_sec

但是使用这种方法我没有得到毫秒。我可以使用Unix.gettimeofday () 获得毫秒精度(甚至更多),但是我必须弄清楚如何将该值的小数部分添加到当前秒数,这对于如此简单的操作来说似乎很麻烦。有没有更好的办法?

【问题讨论】:

标签: time ocaml


【解决方案1】:

您可以使用Unix.gettimeofday (),如果您在分钟内的秒数为 0 时建立基准时间,并且所有后续分钟都为 60 秒长。最后一个闰秒是在 2016 年。因此,您可以询问(比如说)2017 年 1 月 1 日开始的时间,并将其作为您的基准。

我尝试了以下方法,它似乎对我有用:

let (base, _) = Unix.mktime {
    tm_sec = 0;
    tm_min = 0;
    tm_hour = 0;
    tm_mday = 1;
    tm_mon = 0;
    tm_year = 117;
    tm_wday = 0;
    tm_yday = 0;
    tm_isdst = false;
}

let seconds_in_minute () =
    mod_float (Unix.gettimeofday () -. base) 60.0

换句话说,一个快速测试表明,当我的计算机上显示的时间转到下一分钟时,该值会翻转回 0.0。

这应该一直有效,直到时间领主添加下一个闰秒。也许这对您的目的来说已经足够了。

【讨论】:

  • 也许在开始时获取 gettimeofday、localtime 和 gettimeofday(再次)并从那里计算基数。第二个 gettimeofday 是在您获得 x.999 和 (x+1).001 的时间时检测竞争条件,第二个在您获得时间时发生变化。确保两个 gettimeofday 具有相同的第二部分。如果没有再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2015-06-25
  • 2014-10-21
  • 2011-09-03
相关资源
最近更新 更多