如何在JSON中处理日期的问题是直接调用ASP.NET AJAX Web服务和页面方法时可能出现的更麻烦的问题之一。 与该语言中的每个其他数据类型不同,JavaScript不提供表达日期的声明方法。因此,将它们嵌入JSON中需要一些花哨的步法。
我将尝试解释JSON中日期的确切问题。
有什么问题?
基本问题是JavaScript没有提供声明性地表达Date对象的方法。您之前可能已将此描述为(缺少)Date文字。 什么是文字?为了说明,这些是几种其他数据类型的文字:
// String
'foo';
// Number
3.14;
// Boolean
true;
// Array
[1, 2, 3, 5, 7];
// Object
{ pi: 3.14, phi: 1.62 };
不幸的是,当涉及到日期时,缺少文字意味着创建一个文字的唯一方法是通过显式初始化Date对象:
// Correct.
new Date('4/26/09');
// Correct (the month is 0 indexed, hence the 3).
new Date(2009, 3, 26);
// Incorrect. This is a string, not a Date.
'4/26/09';
虽然在编写客户端JavaScript代码时这种限制很好,但它让我们没有在JSON对象中传输日期的好方法。 缺少日期文字是一个问题,有人可以提出解决方案。
答案 0 :(得分:1)
考虑为什么要将DateTime发送到客户端以开始。通常,您正在显示它的字符串表示形式,并且不需要正确的JavaScript Date对象。 更重要的是,如果您最终使用JavaScript Date对象,您可能会使用其他代码或JavaScript库以用户友好的格式显示它。 尽管我很欣赏一个聪明的解决方法,但我宁愿完全避免这个问题。我建议只返回一个格式化的字符串,而不是跳过所有这些箍来在客户端实例化一个JavaScript Date对象然后格式化它。 例如,
[System.Web.Script.Services.ScriptService]
public class DateService : System.Web.Services.WebService
{
[WebMethod]
public string GetDate()
{
return new DateTime(2009, 4, 26).ToLongDateString();
}
}
现在,调用该服务将返回此JSON:
{"d":"Sunday, April 26, 2009"}
不再有正则表达式。没有更多JavaScript Date对象。不再担心在客户端格式化数据。 更好的是,没有功能丢失。如果我们需要实例化日期,我们仍然可以。
答案 1 :(得分:1)
我最近写了一篇关于这类事情的博客文章here ......这是一个雷区!在工作中,我们决定使用发现{3}}的W3C格式的变体,将MVC3服务中的DateTimes和DateTimeOffsets作为字符串传输。对于DateTime,我们对DateTimeOffsets使用YYYY-MM-DDThh:mm:ss,YYYY-MM-DDThh:mm:ss + TZD(这些格式说明符是W3C,而不是.NET)。
但这个问题的答案确实取决于你想对日期做些什么。正如另一个回复所暗示的那样,如果你想做的只是将它显示给最终用户,你可以通过简单地在线上发送一个人类可读的字符串来逃脱。
答案 2 :(得分:0)
我使用两种方法,一种是使其成为Date.UTC(),另一种是将其作为Ticks。他们都工作。
将其转换为Json Ticks的功能
private static readonly long UnixEpochTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;
public static long cOnlyDate(long Ticks)
{
return (864000000000 * (Ticks / 864000000000));
}
public static long ToJsonTicks(DateTime value)
{
return (cOnlyDate(value.ToUniversalTime().Ticks) - UnixEpochTicks) / 10000;
}
结果将类似于{dt : 28839281}
以及如何将其转换为日期
public static string ToJsonDate(DateTime value)
{
return string.Format("Date.UTC({0}, {1}, {2})", value.Year, value.Month-1, value.Day);
}
结果将类似于{d : Date.UTC(2012, 2, 11)}
ps,我现在只测试" Unknow"的解决方案。而不是我的代码。