【发布时间】:2019-05-28 18:44:59
【问题描述】:
我有一个 MVC 应用程序,它以 JSON 格式从美国的服务器发送日期值,并显示在智利的 PC 中。
服务器端在控制器中有这个动作:
public async Task<ActionResult> GetFacturas(Models.DataTableAjaxPostModel model)
{
// Some other code in between
// ----
return Json(fecha); // fecha has the value of 2019-04-16 00:00:00
}
通过使用 Chrome 开发工具,我看到 JSON 对象中收到的日期为 1555383600000。
通过使用https://www.epochconverter.com/ 网站,我将该日期翻译成人类可读的格式,我看到它是:
GMT: Tuesday, 16 April 2019 3:00:00
Your time zone: Monday, 15 April 2019 23:00:00 GMT-04:00
即使 MVC 控制器的日期为 2019-04-16 00:00:00,似乎 Json 对其进行序列化时,它也使用 -3 时区转换为 GMT,因此,客户端计算机最终收到了 GMT 日期,然后应用 -4 操作将日期转换回本地时间。
操作系统配置为-4时区,MVC应用在web.config文件中是这样配置的:
<globalization culture="es-CL" uiCulture="es-CL" />
如何避免这个问题?
编辑:
"fecha" 变量是从数据库返回的 DateTime 对象,这样:
var fecha = db.Entity.Select(f => f.DatetimeField).FirstOrDefault();
当然我简化了查询,但事实是“fecha”在返回函数之前是一个DateTime对象,其值为2019-04-16 00:00:00。
问候
詹姆
【问题讨论】:
-
用户将看到服务器时间,无论其位置如何。如果您需要当地时间,则需要将日期时间返回为 .ToLocalTime().DateTime。您的问题不反映您所期望的。
-
@BalajiBirajdar -
ToLocalTime使用 服务器 的时区。它不了解客户的本地时区。此外,您假设fetcha是DateTimeOffset类型,但这在问题中没有说明。 -
@jstuardo - 你的问题并没有给我们一个完整的画面。我们需要知道您正在序列化的
fetcha变量的数据类型,并且我们还需要查看如何实例化它的示例,以及序列化形式的显示方式。然后我们需要查看您的客户端代码以了解您如何反序列化它。请阅读帮助中心的How to create a Minimal, Reproducible Example。此外,您应该了解时区与文化设置无关。它们是完全不同的概念。 -
@MattJohnson 我已经编辑了这个问题。您可以通过使用我拥有的值创建一个 DateTime 对象来简单地重现它,然后将其作为 Json 对象返回。我没有直接反序列化,因为我使用的是 DataTable jquery 插件。不过,没关系。事实是,如果我使用epochconverter.com 页面查看客户端收到的值,它比实际时间少1 小时。这表明这与显示时间的客户端无关。 Json 对象错误地序列化了日期和时间。
-
@MattJohnson 确切的问题可能是,为什么 Newtonsoft Json 对象使用时区 -3 而不是操作系统中配置的 -4 将 DateTime 对象序列化为 UTC。这导致示例中的日期和时间被传输为 2019-04-16 03:00:00... 因此,在反序列化时,使用时区 -4,导致日期和时间显示为 2019- 04-15 23:00:00。有没有办法将 Newtonsoft Json 对象配置为使用正确的时区?
标签: asp.net json asp.net-mvc datetime timezone