日付形式がMicrosoftの形式と完全に一致するようにJSONを修正する必要があります。これは"/Date(1485360480000-0800)/"
です。もっと良いのは、現在はISO 8601 formatに切り替えることができます。この形式は、現在、日付と時刻に適したJSON形式です。
何らかの理由でJSON形式を修正できない場合は、Json.NETの自動DateTime
認識と解析を無効にして、DateTimeConverterBase
を継承して独自のcustom JsonConverter
を作成する必要があります。
DateParseHandling = DateParseHandling.None
をJsonSerializerSettings
に設定してください。しかし、あなたはあなたの全体的なシリアライザの設定を変更することができない場合は、あなただけQuestion 40632820から、それにコンバータを適用することによって、含むタイプの日付認識を無効にすることができ、例えば:
[JsonConverter(typeof(DateParseHandlingConverter), DateParseHandling.None)] // Disable Json.NET's built-in date time parsing function.
public class RootObject
{
public DateTime pickupBefore { get; set; }
}
次は、カスタムJsonConverter
を記述する必要があります。 1つのオプションは、NewtonsoftのDateTimeUtils.TryParseDateTime()
とDateTimeUtils.TryParseDateTimeOffset()
のすべてのロジックを、プロセス番号DateTimeUtils.TryParseDateTimeMicrosoft()
とDateTimeUtils.TryParseDateTimeOffsetMicrosoft()
に書き換えて、ミリ秒ではなく数秒で解析することです。私はこれをやり始めましたが、かなりの量のコードが含まれていることを認識しました。これは、stackoverflowの答えに適しています。別の方法として、間に合わせと-ハックはそうのように、ミリ秒から変換するために、JSONに余分000
部分文字列を挿入するには、次のようになります。
public class MicrosoftSecondsDateTimeConverter : DateTimeConverterBase
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var token = JToken.Load(reader);
if (token.Type == JTokenType.String)
{
var s = ((string)token).Trim();
if (s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal))
{
// MS datetime format is in milliseconds as is shown here:
// https://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_sidebarb
// But our times are offsets in seconds.
// Convert.
var sb = new StringBuilder("\"\\/Date(");
var insert = "000"; // Seconds to MS
for (int i = 6; i < s.Length - 2; i++)
{
if (s[i] == '-' || s[i] == '+') // Time zone marker
{
sb.Append(insert);
insert = string.Empty;
}
sb.Append(s[i]);
}
sb.Append(insert);
sb.Append(")\\/\"");
s = sb.ToString();
var dt = new JsonSerializer().Deserialize(new StringReader(s), objectType);
return dt;
}
}
// Not a Microsoft date.
return new JsonSerializer().Deserialize(token.CreateReader(), objectType);
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
それは美しいではないですが、仕事を得るん。
[JsonConverter(typeof(DateParseHandlingConverter), DateParseHandling.None)] // Disable Json.NET's built-in date time parsing function.
public class RootObject
{
[JsonConverter(typeof(MicrosoftSecondsDateTimeConverter))]
public DateTime pickupBefore { get; set; }
}
またはあなたの全体のデータモデルのDateTime
文字列の直列化復元を変更するJsonSerializerSettings.Converters
に追加を次のようにその後、あなたのコンバータは、あなたのタイプに適用されます。
サンプルfiddle。
http:// stackoverflow。com/questions/2883576/how-do-you-convert-epoch-time-in-c – Coder14
[C#でエポック時間をどのように変換するのですか?](http://stackoverflow.com/questions/2883576/how -do-you-convert-epoch-time-in-c) – Coder14