关于asp.net mvc:在MVC中,使用Json传输具有time formate属性的对象,如何避免自动减少8小时?

In MVC,using Json to transfer object with time formate property,How to avoid reduce 8 hours automatically?

学生班有一个叫做生日的财产。 我的Web服务器在北京(UTC + 8),当我以JSON格式从服务器获取数据时,生日属性总是比原始日期减少8小时,我该如何更正? 我也在北京,我为所有生日物业增加了8个小时,但如果我在另一个时区或者网络服务器不在北京,那么我必须手动添加其他时间。

在Web服务器上,这是我的代码:

1
    return Json(student);

获取数据的代码:

1
2
  var studentReader= new StreamReader(Request.InputStream);
  var student= JsonHelper.FromJson<Student>(studentReader.ReadToEnd());

JsonHelper类:

1
2
3
4
   public static T FromJson< T >(this string json)
    {
     return JsonConvert.DeserializeObject< T >(json);
    }


建议您应该以UTC格式存储所有日期时间值。在客户端代码中,您可以将其转换为您想要的任何时区。


你的JSON序列化很好。没有问题。

您需要确保将所有日期时间值存储为UTC。当您显示日期时,您可以转换为您需要的时区。

这是我通常这样做的方式:

  • 每次我存储DateTime时,我都使用DateTime.ToUniversalTime()来确保日期在UTC上存储在数据库中。
  • 当我需要在视图中打印日期时,我有一个我使用的方法,它采用特定的TimeZone并转换日期。请参阅下面的代码示例。
  • 我从不依赖客户端区域。如果我拥有来自许多地理位置的广泛用户,那么我选择他们的首选时区并将这些信息存储在他们的个人资料中(Google,Microsoft和37Signals都为他们的网络应用程序执行此操作,仅举几个例子)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public static DateTime ToLocalTimeZone(this object date)
    {        
        DateTime dt;

        if (!DateTime.TryParse(date.ToString(), out dt))
            return DateTime.UtcNow;

        //Timezone string. This can be stored on web.config
        //or on the user profile as well
        var timeZone ="Pacific SA Standard Time";

        var defaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
        var userTime = TimeZoneInfo.ConvertTimeFromUtc(dt, defaultTimeZone);

        return userTime;
    }

有关此前和此处的先前问题的更多信息

编辑:此处允许的时区字符串列表