解析的 F# DateTime 值不等于原始 DateTime 值
Parsed F# DateTime value not equal to the original DateTime value
考虑以下将 DateTime
转换为 string
的代码,尝试使用 DateTime
上的 TryParse
方法解析它,并且 returns一个 DateTime option
表示解析 string
是否成功:
let dt = DateTime.Now
printfn "%A" dt
let parseDateTime (str: string) =
match DateTime.TryParse str with
| (true, v) -> Some v
| _ -> None
let parsedDateTime =
dt.ToString () |> parseDateTime
match parsedDateTime with
| Some v ->
printfn "%A" v
assert (v = dt)
| _ -> ()
assert
语句失败,这是我不希望的。 printfn
向控制台打印出相同的字符串,这让我更加困惑。
如果我将上面的 assert
语句更改为 assert (v.ToString() = dt.ToString())
,那么在比较两个 DateTime
值时,assert
会像我预期的那样通过。
关于 DateTime
平等,我是否遗漏了什么?我还使用 int
和 Guid
对此进行了测试(分别将 DateTime.TryParse
换成 Int32.TryParse
和 Guid.TryParse
)并且 assert
通过了我在比较相等值时会期望它。
一个DateTime
值的解析是单个“tick", which represents one ten-millionth of a second. You also need to consider time zone differences. The default output format doesn't include this level of detail. If you want to "round trip”一个DateTime
,用ToString("o")
写出来,然后用DateTimeStyles.RoundtripKind
时解析:
open System
open System.Globalization
let parseDateTime (str: string) =
match DateTime.TryParse(str, null, DateTimeStyles.RoundtripKind) with
| (true, v) -> Some v
| _ -> None
let parsedDateTime =
dt.ToString ("o") |> parseDateTime // e.g. "2021-11-15T15:36:07.6506924-05:00"
考虑以下将 DateTime
转换为 string
的代码,尝试使用 DateTime
上的 TryParse
方法解析它,并且 returns一个 DateTime option
表示解析 string
是否成功:
let dt = DateTime.Now
printfn "%A" dt
let parseDateTime (str: string) =
match DateTime.TryParse str with
| (true, v) -> Some v
| _ -> None
let parsedDateTime =
dt.ToString () |> parseDateTime
match parsedDateTime with
| Some v ->
printfn "%A" v
assert (v = dt)
| _ -> ()
assert
语句失败,这是我不希望的。 printfn
向控制台打印出相同的字符串,这让我更加困惑。
如果我将上面的 assert
语句更改为 assert (v.ToString() = dt.ToString())
,那么在比较两个 DateTime
值时,assert
会像我预期的那样通过。
关于 DateTime
平等,我是否遗漏了什么?我还使用 int
和 Guid
对此进行了测试(分别将 DateTime.TryParse
换成 Int32.TryParse
和 Guid.TryParse
)并且 assert
通过了我在比较相等值时会期望它。
一个DateTime
值的解析是单个“tick", which represents one ten-millionth of a second. You also need to consider time zone differences. The default output format doesn't include this level of detail. If you want to "round trip”一个DateTime
,用ToString("o")
写出来,然后用DateTimeStyles.RoundtripKind
时解析:
open System
open System.Globalization
let parseDateTime (str: string) =
match DateTime.TryParse(str, null, DateTimeStyles.RoundtripKind) with
| (true, v) -> Some v
| _ -> None
let parsedDateTime =
dt.ToString ("o") |> parseDateTime // e.g. "2021-11-15T15:36:07.6506924-05:00"