解析的 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 平等,我是否遗漏了什么?我还使用 intGuid 对此进行了测试(分别将 DateTime.TryParse 换成 Int32.TryParseGuid.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"