读书人

序列化了一组json数据得到的日期的值

发布时间: 2012-04-25 19:32:32 作者: rapoo

序列化了一组json数据,得到的日期的值不会处理了!

C# code
  List<NUser> list = new List<NUser>();                        NUser item = null;                        for (int i = 1; i < 10; i++)                        {                            item = new NUser();                            item.ID = i;                            item.Name = i + "_Name";                            item.Time = DateTime.Now.AddDays(i * -1);                            list.Add(item);                        }                        JavaScriptSerializer serializer = new JavaScriptSerializer();                        result = serializer.Serialize(list);                        context.Response.Write(result);                        context.Response.End();

ajax请求上面的代码,返回一组序列化好的json数据,在前台接收到之后,result[0].Time的值是: "/Date(1335230881375)/"
怎么用js处理成我想要的格式啊? 格式:2012-4-25 9:29:21

[解决办法]
static void Main(string[] args) 
{ 
  string [] jsonDates = {"/Date(1242357713797+0800)/" , "/Date(1242357722890+0800)/"}; 
  foreach (string jsonDate in jsonDates) 
  { 
    Console.WriteLine("Json : {0}", jsonDate); 
    DateTime dtResult =  JsonToDateTime(jsonDate); 
    Console.WriteLine("DateTime: {0}", dtResult.ToString("yyyy-MM-dd hh:mm:ss ffffff")); 
  } 
  Console.Read(); 
} 

public static DateTime JsonToDateTime(string jsonDate) 
{ 
  string value = jsonDate.Substring(6, jsonDate.Length - 8); 
  DateTimeKind kind = DateTimeKind.Utc; 
  int index = value.IndexOf('+', 1); 
  if (index == -1) 
    index = value.IndexOf('-', 1); 
  if (index != -1) 
  { 
    kind = DateTimeKind.Local; 
    value = value.Substring(0, index); 
  } 
  long javaScriptTicks = long.Parse(value, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture); 
  long InitialJavaScriptDateTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks; 
  DateTime utcDateTime = new DateTime((javaScriptTicks * 10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc); 
  DateTime dateTime; 
  switch (kind) 
  { 
    case DateTimeKind.Unspecified: 
      dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified); 
      break; 
    case DateTimeKind.Local: 
      dateTime = utcDateTime.ToLocalTime(); 
      break; 
    default: 
      dateTime = utcDateTime; 
      break; 
  } 
  return dateTime ; 
}
[解决办法]
在你后台序列化时候不要用datetime类型,直接用string类型,然后序列化,在前台反序列化就不会出现这个问题了
也就是在你的NUser类中这么设置属性string date,你的应该是datetime date
[解决办法]
参考

http://kb.cnblogs.com/a/2365098/
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace HKH.Web.MVC
{
public class DateTimeHelper
{
/// <summary>
/// Parse Json data string to C# DateTime
/// </summary>
/// <param name="jsonDate"></param>
/// <returns></returns>
public static DateTime FromJson(string jsonDate)
{
return FromJson(jsonDate, DateTimeKind.Local);
}

/// <summary>
/// Parse Json data string to C# DateTime
/// </summary>
/// <param name="jsonDate"></param>


/// <param name="kind"></param>
/// <returns></returns>
public static DateTime FromJson(string jsonDate, DateTimeKind kind)
{
Regex regex = new Regex(@"^/Date\(([0-9]+)(\+[0-9]+)?\)/$");

long InitialJavaScriptDateTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;
DateTime utcDateTime = new DateTime(long.Parse(regex.Replace(jsonDate, "$1")) * 10000 + InitialJavaScriptDateTicks, DateTimeKind.Utc);

DateTime dateTime;
switch (kind)
{
case DateTimeKind.Unspecified:
dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified);
break;
case DateTimeKind.Local:
dateTime = utcDateTime.ToLocalTime();
break;
default:
dateTime = utcDateTime;
break;
}

return dateTime;
}
}
}
[解决办法]
上面是C#, 下边是JS解析


//add static method to Date class
Date.fromJson = function(jsonDateString) {
return eval(jsonDateString.replace(new RegExp('\/Date\\((-?[0-9]+)\\)\/', 'g'), "new Date($1)"));
};

[解决办法]

探讨

在你后台序列化时候不要用datetime类型,直接用string类型,然后序列化,在前台反序列化就不会出现这个问题了
也就是在你的NUser类中这么设置属性string date,你的应该是datetime date

[解决办法]

正则得改一下

string pattern = @"\\/Date\((\d+)\+\d+\)\\/";
[解决办法]
function ParseDate(jsonDate) {
var date = new Date(parseInt(jsonDate.substr(6)));
return date.getFullYear()+"-" + (date.getMonth()+1) + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
}

读书人网 >asp.net

热点推荐