You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#解析所得DateTime值与原始值不相等问题咨询

问题根因

DateTime的相等判断会同时校验两个核心属性:Ticks(时间精度,单位为100纳秒)和Kind(时间类型,枚举值为Utc/Local/Unspecified),只有二者完全一致时才会返回true,你遇到的问题正是这两个属性在序列化/反序列化过程中出现了丢失:

  • Ticks精度丢失:无参数的DateTime.ToString()默认输出不会包含完整的ticks信息,通常仅精确到秒或毫秒级,原始DateTime.Now自带的微秒、纳秒级精度会在转字符串时被截断。TryParse从截断后的字符串解析出来的新DateTime,ticks值和原始值不一致。
  • Kind属性丢失:默认ToString()输出的字符串不会携带Kind标识,默认的DateTime.TryParse解析出来的结果Kind为Unspecified,而原始DateTime.Now的Kind是Local,二者本身就不相等。

你看到两次printfn "%A"输出一致,是因为%A格式化DateTime时同样不会输出高精度ticks和Kind信息,看起来一样但实际底层值有差异。

为什么int、Guid不存在这个问题

这两个类型的无参ToString()会输出完整的、能唯一标识原值的全部信息,TryParse反序列化后可以得到和原值完全一致的结果,所以相等判断可以通过。

解决方案

如果需要实现DateTime序列化后完全还原,使用往返格式字符串"o"进行转换即可,该格式会包含完整的ticks和Kind信息:

let parsedDateTime =
  dt.ToString("o") |> parseDateTime

修改后原断言assert (v = dt)即可正常通过。

内容的提问来源于stack exchange,提问作者user279185

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:36:05