50

json.net を使用して a を逆シリアルDateTimeOffset化していますが、指定されたタイムゾーンを無視し、日時をローカル オフセットに変換しています。たとえば、与えられた

var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";

以下を使用してデシリアライズする場合:

var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind };
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings);

obj には a を含むプロパティが含まれますDateTimeOffsetが、値は2012-07-19T15:30:00+10:30元のタイムゾーンを維持する代わりにローカル タイムゾーンに変換されます。

DateTimeOffset結果のプロパティが指定された値と一致するように、期待どおりに解析される値を取得する方法はありますか?

4

8 に答える 8

17

無視しているようでDateParseHandling.DateTimeOffset、を使用してDateParseHandling.DateTimeいます。ここに問題を記録します:https ://github.com/JamesNK/Newtonsoft.Json

于 2012-08-01T16:19:10.733 に答える
16

.NET WebApi を使用している場合は、WebApiConfig.csファイルに次を追加して、アプリケーションでこれをグローバルに処理できます。

config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = 
    Newtonsoft.Json.DateTimeZoneHandling.Local;

これによりJsonFormatter、日付をシリアル化および逆シリアル化するときに、ローカル タイム ゾーン情報を含めて理解するように明確に指示されます。

于 2015-08-28T19:14:10.767 に答える
11

ある時点で同じ問題が発生し、アップデートで修正されたため、どのバージョンを使用したかはわかりません...

あなたのコードは私にとってもうまくいきませんが、次のようなクラスを作成すると

public class A
{
    public DateTimeOffset startDateTime;
}

そして電話する

var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);

すべてが期待どおりに機能します。はい、それは確かにバグです。はい、あなたが望むとおりの結果を得る方法はわかりませんが、おそらく他の誰かに役立つでしょう。

于 2012-12-17T16:01:37.320 に答える
0

これらの設定をシリアライザーで使用するには、次のように入力します。

var serializerSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
                DateTimeZoneHandling = DateTimeZoneHandling.Local
            };
            var serializer = JsonSerializer.Create(serializerSettings);
于 2018-09-25T12:59:02.687 に答える