JavaScriptSerializer 从日期中减去一天 [英] JavaScriptSerializer is subtracting one day from date

查看:16
本文介绍了JavaScriptSerializer 从日期中减去一天的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 JavaScriptSerializer 来序列化 DateTime,但是当我反序列化它时,它会显示比它被序列化的日期少一天:

I am using JavaScriptSerializer for serializing DateTime, but when I deserialize it show one day less from the date it get serialize:

这里是测试:

  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);

首先我认为这是因为 javascript 日期时间格式,但正如我所知,javascript 月份是零索引 0=January,但我得到的时间比原始日期少一天.

firstly I thougt it because of javascript datetime format but as I know for javascript Month is zero index 0=January, but I am getting one day less than the original date.

推荐答案

它不会随意丢失一天,而是转换为 UTC 日期(或者我应该说使用 UTC 日期格式的日期),所以当它被反序列化时,你不再在您的个人时区内.它基本上是在执行:

It's not losing a day arbitrarily, it's converting to a UTC date (or I should say using the date in a UTC date format) so when it's unserialized it you're no longer within your personal time zone. It's basically performing:

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);

但是,请尝试以下操作:

However, try the following:

// or you rely on it serializing, then bring it back to your own local time
// (apply the time zone).
afterDeserialize = afterDeserialize.ToLocalTime();

您现在会将 UTC 时间恢复为您的本地时间(应用时区).

You'll now have the UTC time back to your local time (with time zone applied).

要通过测试:

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!

这篇关于JavaScriptSerializer 从日期中减去一天的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆