私はしばらくの間、JSON 文字列で日付を扱ってきましたが、そのための標準的な方法はありません。そのため、非常に多くの異なる方法があります。そもそもJSON仕様で日付の標準フォーマットを指定できればよかったのかも!
マイクロソフトは独自の方法でそれを行っており、1970 年以降のミリ秒を UTC 形式でカウントすると、次のようになります。"/Date(1319266795390+0800)/"
出力に正規表現を使用して以来、上記の文字列をISO-8601 形式に変更してきましたASP.Net JavaScriptSerializer
。これは W3C 標準であり、人間が判読できるものであり、ほとんどのブラウザーが日付を文字列にシリアル化する方法です。方法は次のとおりです。
static readonly long DATE1970_TICKS = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
static readonly Regex DATE_SERIALIZATION_REGEX = new Regex(@"\\/Date\((?<ticks>-?\d+)\)\\/", RegexOptions.Compiled);
static string ISO8601Serialization(string input)
{
return DATE_SERIALIZATION_REGEX.Replace(input, match =>
{
var ticks = long.Parse(match.Groups["ticks"].Value) * 10000;
return new DateTime(ticks + DATE1970_TICKS).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
});
}
ニーズを満たすために形式を簡単に変更できます。カスタムの日付と時刻の形式については、こちらの MSDN 記事をご覧ください。
使用方法は次のとおりです。
JavaScriptSerializer ser = new JavaScriptSerializer();
var JsonSrt = ISO8601Serialization(ser.Serialize(DateTime.Now)); // "\"2012-05-09T14:51:38.333\""
アップデート:
サーバーから返された JSON 文字列を JavaScript で微調整して、Regex を使用してより読みやすい形式にする別の方法があります。
var str = "/Date(1319266795390+0800)/";
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) {
return new Date(Number(date)).toString();
});