【问题标题】:Json returns different dates when local machine and server in different timezones当本地机器和服务器处于不同时区时,Json 返回不同的日期
【发布时间】:2010-07-26 05:59:53
【问题描述】:

我在 json 日期解析中遇到了一个奇怪的问题。我正在使用以下内容来解析 json 日期:

dateFormat(new Date(parseInt(user.RegDate.substr(6))), "mm/dd/yyyy")

当我的本地机器(客户端)与服务器时区位于不同的时区时,当我尝试检索用户的注册日期时,它会返回不同的日期。

例如:

SQL 中的注册日期:2010-07-22 19:00:00.000

当我在 IST 时区的本地机器上调试时,返回的 JsonResult 日期为:

/Date(1279805400000)/
Thu Jul 22 19:00:00 UTC+0530 2010

当我从位于 EST 时区的已部署服务器访问相同的数据时,返回的 JsonResult 日期为:

/Date(1279843200000)/
Fri Jul 23 05:30:00 UTC+0530 2010

当我将本地计算机更改为 EST 时区时,这很完美(返回相同的日期 - 7 月 22 日星期四)。我在这里错过什么了吗?请推荐

服务器代码是[编辑]:

public JsonResult GetregisteredUsersJSON()
{
   var usersList = this.GetregisteredUsers()
   return Json(usersList, JsonRequestBehavior.AllowGet);
}

private List<Users> GetregisteredUsers()
{
    return (from u in _context.mu_Users
        orderby u.Reg_Date descending
        select new Users
        {
            FirstName = u.First_Name,
            LastName = u.Last_Name,
            RegDate = u.Reg_Date
        }).ToList();
}

【问题讨论】:

标签: jquery json timezone jsonresult


【解决方案1】:

如果您将数据保存在数据库中而不指定它是 UTC,那么您将希望 JsonResult 在序列化期间不转换 DateTime。为此,您需要使用 ActionResult 而不是 JsonResult,然后将 Json 数据序列化,并将 JsonSerializerSettings 设置为 Unspecified。

public ActionResult GetregisteredUsersJSON() { var usersList = this.GetregisteredUsers() return Content(JsonConvert.SerializeObject(usersList, new JsonSerializerSettings{DateTimeZoneHandling = DateTimeZoneHandling.Unspecified })); }

【讨论】:

    【解决方案2】:

    我强烈怀疑这是您的服务器端的问题,以及误解了格式化的客户端值。

    您应该发送 UTC 值,而看起来您发送的是 local 值。我假设您的数据库中的值是 UTC 值 - 否则整个事情开始变得有些随意。当您的服务器更改时区时,您正在发送不同的值这一事实应该是一个很大的警告灯。当您调用 Date 构造函数时仅采用毫秒值时,这意味着自 1970 年 1 月 1 日 UTC 以来的毫秒数。

    假设您的值是 1900 UTC,您应该在您的 IST 客户端上看到“Fri Jul 23 00:30:00 UTC+0530 2010”和“Thu Jul 22 12:00 :00 UTC-0700 2010" 在您的 EST 客户端上 - 因为它们都代表相同的 UTC 时间。

    您的服务器代码是什么样的?

    【讨论】:

    • 我已经用服务器代码更新了我的问题。我没有在服务器端转换任何日期,我只是从数据库中获取日期值并传递给客户端
    【解决方案3】:

    今天我也发生了同样的事情。我正在使用 sql server 日期字段,只是通过 MVC 将从 DB 检索到的日期转换为 json。我无法真正解释造成差异的原因,但我怀疑它与我的本地环境不同步的 sql server 08 R2 更新有关。

    无论如何,我可以通过仅在 c# 代码中设置日期来修复它。为了便于使用,我创建了一个扩展方法:

        public static DateTime DateOnly(this DateTime date)
        {
            return new DateTime(date.Year, date.Month, date.Day);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 2014-07-30
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2016-06-02
      相关资源
      最近更新 更多