3

JSON 中如何处理日期的问题是直接调用 ASP.NET AJAX Web 服务和页面方法时可能出现的比较麻烦的问题之一。与该语言中的所有其他数据类型不同,JavaScript 没有提供表示日期的声明方法。因此,将它们嵌入 JSON 需要一些花哨的步法。

我将尝试解释 JSON 中的日期到底有什么问题。

有什么问题?

根本问题是 JavaScript 没有提供一种以声明方式表达 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 对象中传输日期的好方法。缺少日期文字是一个问题,有人可以提出解决方案。

4

3 回答 3

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 日期对象。无需再担心在客户端格式化数据。更好的是,没有功能丢失。如果我们需要实例化 Dates,我们仍然可以。

于 2012-04-06T08:30:05.527 回答
1

我最近在这里写了一篇关于这类事情的博客文章……这是一个雷区!在工作中,我们决定使用此处找到的 W3C 格式的变体,将 MVC3 服务中的 DateTimes 和 DateTimeOffsets 作为字符串传输。对于 DateTime,我们使用 YYYY-MM-DDThh:mm:ss,对于 DateTimeOffsets,我们使用 YYYY-MM-DDThh:mm:ss+TZD(这些格式说明符是 W3C,而不是 .NET)。

但是这个问题的答案确实取决于你想对日期做什么。正如另一个回复所暗示的那样,如果您只想将其显示给最终用户,那么您可能只需通过网络发送一个人类可读的字符串即可。

于 2012-04-06T08:49:39.123 回答
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,我现在只是测试“未知”的解决方案,不适用于我的代码。

于 2012-04-06T08:37:45.600 回答