Ocaml 将字符串从格式字符串转换为Core.Time.t

Ocaml 将字符串从格式字符串转换为Core.Time.t,ocaml,ocaml-core,Ocaml,Ocaml Core,我必须将格式为%d/%m/%Y%H:%m:%S的字符串转换为Time.t。是否有日历的打印机.Time.from\u fstring功能的核心等价物?基本版本 据我所知,Core库中没有这样的函数。您可以使用scanf轻松实现这一点: open Core.Std let of_parts d m y hr min sec = let time_of_day = Time.Ofday.create ~hr ~min ~sec () in let m = Month.of_int_exn

我必须将格式为
%d/%m/%Y%H:%m:%S
的字符串转换为Time.t。是否有日历的
打印机.Time.from\u fstring
功能的核心等价物?

基本版本 据我所知,
Core
库中没有这样的函数。您可以使用
scanf
轻松实现这一点:

open Core.Std

let of_parts d m y hr min sec =
  let time_of_day = Time.Ofday.create ~hr ~min ~sec () in
  let m = Month.of_int_exn m in
  let date = Date.create_exn ~y ~m ~d in
  Time.of_date_ofday date time_of_day ~zone:Time.Zone.utc

let strptime0 data =
  Scanf.sscanf data "%d/%d/%d %d:%d:%d" of_parts
完整版本
strptime0
是一种第一近似值,它将以固定格式解析输入。实现真正的
strtime
函数并不难,它将接受格式。为此,我们需要实施以下步骤:

转换格式字符串 首先,我们需要将格式字符串从
strtime
语言转换为格式语言,例如,转换
%Y->%4d
等,然后使用
Scanf.format\u from\u string
获取
格式
对象的实例。此函数的返回值应为适合scanf的格式,以及编码为数组的置换矩阵

重新排列参数 可以使用数组指定元素的顺序:

(** [rearrage f p a0 a1 a2 a3 a4 a5] call function [f] with
    provided arguments passed in the order specified by the
    permutation [p]

    The [i]th element of the permutation [p] specifies the subscript
    of the [i]'th argument to function [f]. Effectively [f] is called
    like this: $f a_{p[0]} ... a_{p[i]} ... a_{p[5]}$ *)

let rearrange f arr a1 a2 a3 a4 a5 a6 =
  let args = [| a1; a2; a3; a4; a5; a6 |] in
  f args.(arr.(0)) args.(arr.(1)) args.(arr.(2))
    args.(arr.(3)) args.(arr.(4)) args.(arr.(5))
(如果我们用整数表示所有部分,一次就可以了 我们将引入浮点参数(对于
%S
,我们需要将参数提升到我们自己的编号类型中)

粘在一起 最后,你会得到这样的结果(你仍然需要填写存根)

因此,我们可以采取以下措施:

# strptime "09/05/1945 12:04:32" "%d/%m/%Y %H:%M:%S";;
- : Core.Std.Time.t = 1945-05-09 08:04:32.000000-04:00
# strptime "09/05/1945 12:04:32" "%d/%m/%Y %H:%M:%S";;
- : Core.Std.Time.t = 1945-05-09 08:04:32.000000-04:00