F# JSON 类型提供程序:处理 DateTime 和 TimeZone

F# JSON Type Provider: Handling DateTime and TimeZone

让我们假设以下示例代码:

[<Literal>]
let jsonSample =
   """
   {
      "TimeInterval": {
          "Start" : "2010-01-01",
          "End"   : "2010-01-02"
      }
   }
   """

type MyJson = JsonProvider<jsonSample>

TypeProvider 成功地将字段类型识别为 DateTime,但它会自动将“DateTimeKind”字段设置为“Local”。结果,我的代码变得依赖于它 运行 所在的机器和 Windows 设置中设置的时区。

当我尝试往返以下记录时:

{ "TimeInterval": { "Start" : "2010-01-01", "End" : "2010-01-02" } }

并且我的机器设置为“Europe/Bern +1”,我最终序列化

{ "TimeInterval": { "Start" : "2010-01-01T00:00:00000+01:00", "End" : "2010-01-02T00:00:00000+01:00" } }

我可以更改此行为并指示类型提供程序将 DateTime 的“种类”字段保留为“未指定”吗?

编辑:

我通过以下方式往返:

let json = MyJson.Parse inFilePath
use outputStream = new StreamWriter(outFilePath, false)
outputStream.WriteLine (json.JsonValue.ToString())
json.JsonValue.ToString()

我认为 JSON 类型提供程序中没有配置时区处理的方法。这始终是一场噩梦,无论您如何处理它,所以我认为我们必须为此添加太多参数才能让人们做他们可能需要做的所有事情。

不幸的是,我的建议是仅更改示例,以便您获得 string 的值。这意味着您必须自己处理日期,但它应该可以解决往返问题。

[<Literal>]
let jsonSample =
   """
   {
      "TimeInterval": {
          "Start" : "handling dates is pain / 2010-01-01",
          "End"   : "handling dates is pain / 2010-01-02"
      }
   }
   """