解析 DateTime 时出现问题

Issue parsing DateTime

提问人:techno 提问时间:7/18/2023 最后编辑:Soner Gönültechno 更新时间:7/19/2023 访问量:109

问:

我有以下字符串2023-07-18 11:38 AM

我正在尝试使用以下代码来解析它

fromDate = DateTime.ParseExact(adhocData.FromDateTime, 
                               "YYYY-MM-DD hh:mm tt",
                               CultureInfo.InvariantCulture).Date;

但是我不断收到以下错误

字符串“2023-07-18 11:38 AM”未被识别为有效的 DateTime

C# .NET 日期时间

评论

1赞 Panagiotis Kanavos 7/18/2023
你谈论格式化,但后解析代码。DateTime 没有格式,它是一个二进制值。是什么,它从何而来?为什么它不是 DateTime 或 DateTimeOffset,而是字符串?adhocData.FromDateTime
0赞 Panagiotis Kanavos 7/18/2023
当您将错误作为 JSON 发布时,我怀疑您正在构建一个 Web 应用程序并以 JSON 字符串的形式返回部分异常(没有帮助)。JSON 中的日期采用ISO8601格式,而该 sting 不是该格式。API 使用自定义格式(坏主意),或者实际的 DateTime 值被格式化为具有本地化格式的字符串(也是坏主意)
0赞 techno 7/19/2023
@PanagiotisKanavos 日期从前端格式化为字符串,并传递回 c# 后端。
0赞 Panagiotis Kanavos 7/19/2023
前端有一个错误,必须修复。RFC-7943 标准指定日期应采用ISO8601,并且该字符串不是该格式。 不是标准的一部分。ASP.NET Core 会自动将ISO8601映射到 DateTime。JavaScript 也会生成一个ISO8601字符串AM/PMtoJSON()
0赞 techno 7/19/2023
@PanagiotisKanavos 在前端,我们使用 react 打字稿。使用了一个 moment 对象,并将其转换为像这样的字符串。你为什么认为这是一个错误,我们在后端做同样的格式化。apiFromDateTime?.format('YYYY-MM-DD hh:mm a')

答:

3赞 sommmen 7/18/2023 #1

您的格式略有错误,请尝试:

DateTime.ParseExact("2023-07-18 11:38 AM", 
                    "yyyy-MM-dd hh:mm tt",
                    CultureInfo.InvariantCulture);

请注意年份和日期组件的上限!

3赞 Sandeep Manchukonda 7/18/2023 #2

使用字符串格式“yyyy-MM-dd hh:mm tt”而不是“YYYY-MM-DD hh:mm tt”。

这解决了问题,甚至时间也显示正确。

在此处查看程序

评论

0赞 Hans Kesting 7/18/2023
请发布您的代码文本,而不是图像
1赞 Panagiotis Kanavos 7/19/2023 #3

更好的选择是确保从客户端发送ISO8601。从注释中,字符串是在 React 应用程序中使用 moment 和 生成的。没有必要这样做。apiFromDateTime?.format('YYYY-MM-DD hh:mm a')

moment不过,对象被序列化为开箱即用ISO8601。文档示例演示了如何将包含对象的对象序列化为 JSON:moment

JSON.stringify({
    postDate : moment()
}); 

这会产生

'{"postDate":"2013-02-04T22:44:30.652Z"}'

将其发布到服务器应该可以正常工作。借用 MDN 的 fetch 示例fetch

const data={
    postDate : moment()
}

const response = await fetch("https://example.com/profile", {
      method: "POST", // or 'PUT'
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(data),
    });