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
16public 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;
}
有关此前和此处的先前问题的更多信息
编辑:此处允许的时区字符串列表