21

カスタムDateTimeConverterBase実装の不足で、Json.NET 4.5+ を use に設定したときに、指定されたDateFormatHandling.MicrosoftDateFormat非 UTC のタイムゾーン オフセットを追加しないようにする方法はありDateTimeますか?

"\/Date(1333645844276-0600)\/"

詳細

API プロジェクトを組み込みの .NETJavaScriptSerializerから Json.NET を使用して JSON を生成するように切り替えています。Json.NET では、UTCDateTimeのデフォルトの日時シリアル化は .NET バージョンと同様でした。

"\/Date(1333645844276)\/"

非 UTC の場合、 とは異なりJavaScriptSerializer、Json.NET はタイムゾーン オフセットを結果に追加します (私の地域では、この時期は -6):

"\/Date(1333645844276-0600)\/"

Json.NET 4.5+を\/Date(...)\/フォーマットに戻すために使用しているコードは次のとおりです(と呼ばれますMicrosoftDateFormat):

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);

解決策は、Json.NET に別のDateTimeZoneHandling設定を使用するように指示するのと同じくらい簡単に思えました。DateTimeZoneHandling( LocalUtcUnspecified、および)のすべての設定を試しましRoundtripKindたが、すべて出力で「-0600」が維持されます。実際、それらはすべて非 UTC に対して同じ結果を生成しDateTimeます。

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"

警告

理想的には、すべての時間を既に UTC に合わせておきます。私は確かに、この API の次のバージョンでそうするつもりです。これはライブ API であるため、新しいバージョンがリリースされるまで、出力の変更を危険にさらす価値はありません。ほとんどの JSON 解析システムでは問題にならないようですが、JSON 標準では日付のシリアル化について公式に何も述べられていないため、変更の危険を冒すことはできません。

4

2 に答える 2

13

私にとってはうまくいくようです。以下を参照してください。私の JSON.NET アセンブリは、それがバージョン「4.5.0.0」であると言っています。

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"

おそらく修正されたバグでしたか?

明示的に日付を作成する:

var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
    }));
// {"thedate":"\/Date(1234652400000)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}
于 2012-08-06T10:40:10.450 に答える
4

DateTime最新バージョン 9.0.0からタイムゾーン オフセットを削除する解決策を見つけました。

var time = DateTime.Now;

Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));

//"{"thedate": "2016-12-15T09:20:00.9375403"};
于 2016-12-15T14:43:19.423 に答える