Zah*_*med 20 datetime javascriptserializer c#-4.0
我正在使用JavaScriptSerializer序列化DateTime,但是当我反序列化它显示从序列化日期开始减少一天:
这是测试:
DateTime startDate=new DateTime(2012,1,20);//set the 20th of January
JavaScriptSerializer serializer=new JavaScriptSerializer();
string serializeDate= serializer.Serialize(startDate);
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);//I get 19th of Jan
Assert.Equals(startDate, afterDeserialize);
Run Code Online (Sandbox Code Playgroud)
首先我认为它是因为javascript日期时间格式,但我知道javascript月份是零索引0=January,但我比原始日期少一天.
Bra*_*tie 20
它不会随意丢失一天,它会转换为UTC日期(或者我应该说使用UTC日期格式的日期),所以当它被反序列化时,它就不再属于您的个人时区.它基本上是在执行:
DateTime whateverDate = /* incoming date */;
long ticks = whateverDate.ToUniversalTime() // make UTC
.Subtract(new DateTime(1970, 1, 1)) // subtract UNIX Epoch
.TotalMilliseconds(); // get milliseconds since then
// push in to the "\/Date(ticks)\/" format
String value = String.Format(@"\/Date({0})\/", ticks);
Run Code Online (Sandbox Code Playgroud)
但是,请尝试以下方法:
// or you rely on it serializing, then bring it back to your own local time
// (apply the time zone).
afterDeserialize = afterDeserialize.ToLocalTime();
Run Code Online (Sandbox Code Playgroud)
您现在可以将UTC时间恢复到当地时间(应用时区).
通过测试:
DateTime startDate = new DateTime(2012,1,20);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String serializeDate = serializer.Serialize(startDate);
DateTime afterDeserialize = serializer.Deserialize<DateTime>(serializeDate)
.ToLocalTime(); // Note: this is added
Assert.Equals(startDate, afterDeserialize); // pass!
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题并通过使用解决了它
Newtonsoft.Json.JsonConvert.SerializeObject()
Run Code Online (Sandbox Code Playgroud)
代替
new System.Web.Script.Serialization.JavaScriptSerializer().Serialize().
Run Code Online (Sandbox Code Playgroud)
后一个调用将您的 DateTime 存储为某个随机时区(GMT+0 似乎是硬编码的)。
| 归档时间: |
|
| 查看次数: |
8023 次 |
| 最近记录: |