本文详解JavaScript与C#之间DateTime对象的相互转换方法。重点解析JSON序列化产生的'/Date(timestamp)/'格式,展示JS解析技巧,并深入解决C# ConvertTime函数因UTC时区差异导致的8小时偏差问题,提供修正后的完整代码。
JSON序列化后的日期字符串格式
在开发MVC与EXTJS交互时,常需处理日期格式的相互转换。从.NET服务器端序列化DateTime对象后,返回给前端的通常是一个特定字符串,例如 '/Date(1335258540000)/'。
该字符串中的整数部分(如1335258540000)代表自1970年1月1日00:00:00 UTC起至目标时间的毫秒数。利用JavaScript的eval函数,可将此字符串转换为带有时区信息的Date对象。
具体实现方式为:var date = eval('new ' + eval('/Date(1335258540000)/').source)。执行后,变量date即为一个标准的JavaScript Date对象。
可通过alert(date)直观查看转换结果,确认对象内容。
转换后的输出示例为:Tue Apr 24 17:09:00 UTC+0800 2012。
C#端毫秒数获取与JS端解析
上述字符串由C# JSON序列化自动生成。若需手动获取该毫秒数,可编写C#函数实现,逻辑与JSON序列化生成的数值一致。
public long MilliTimeStamp(DateTime TheDate)
{
DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = TheDate.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return (long)ts.TotalMilliseconds;
}
通过自定义函数获取的毫秒数,与JSON序列化字符串中提取的整数完全相同。
客户端到服务器的时间转换与时区修正
然而,从客户端向服务器提交数据时,日期转换会遇到挑战。主要问题是如何将JavaScript的Date对象正确传回服务器端。
基本思路是:在客户端调用Date对象的getTime()方法获取毫秒整数,服务器端再将该整数解析并构造为C#的DateTime对象。但在逆向转换过程中,可能会遇到时区处理不当的问题。
public DateTime ConvertTime(long milliTime)
{
long timeTricks = new DateTime(1970, 1, 1).Ticks + milliTime * 10000 ;
return new DateTime(timeTricks);
}
若直接使用ConvertTime函数,结果可能比预期少8小时。这是因为服务器时区为东八区(UTC+8),而C#的时间戳单位是100纳秒(即一千万分之一秒)。因此,需额外加上8小时对应的纳秒数,计算公式为:8 * 3600 * 10000000。
基于上述分析,修正后的ConvertTime函数应包含时区偏移量的计算。
public DateTime ConvertTime(long milliTime)
{
long timeTricks = new DateTime(1970, 1, 1).Ticks + milliTime * 10000 + TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours * 3600 * (long)10000000;
return new DateTime(timeTricks);
}
以上即为JavaScript与C#时间日期格式转换的完整示例,供参考使用。