2017-02-01 23 views
-1

私は簡単なWebAPIプロジェクトを持っています。私はJSON日付をEpoch形式で渡しています "pickupBefore": "/ Date(1485360480-0800)/" .Netがそれをキャッチすると、DateTimeは1970年を示します。 それは2017年1月25日であると考えられます。 リアルタイムで取得するにはどうすればよいですか?JSONから.Netエポック日付変換

私の.Netアプリケーションでは、私はDateTimeとして日付をキャッチしています。その背後には、DateTime構造体が1970年代の日付で埋められています。その構造体でリアルタイムのDateTimeに変換するのに役立つものを探していました。

私は質問をする前に見て、How do you convert epoch time in C#?を試しましたが、私の問題を解決するのに役立たなかった。 はあなた

+0

http:// stackoverflow。com/questions/2883576/how-do-you-convert-epoch-time-in-c – Coder14

+3

[C#でエポック時間をどのように変換するのですか?](http://stackoverflow.com/questions/2883576/how -do-you-convert-epoch-time-in-c) – Coder14

答えて

2

ありがとう基本的な問題は、あなたの日付文字列がUnixエポック時間であるが、the documentationで説明したように、MicrosoftのJSONの日付形式は、ミリ秒Unixエポック時間であるということです。 Json.NETは自動的にMicrosoft形式の日付文字列を認識し、オフセットをミリ秒単位で解釈するので、1970年がUnixエポックの初めの年であるため、年の1970年の日付がになっています。

日付形式がMicrosoftの形式と完全に一致するようにJSONを修正する必要があります。これは"/Date(1485360480000-0800)/"です。もっと良いのは、現在はISO 8601 formatに切り替えることができます。この形式は、現在、日付と時刻に適したJSON形式です。

何らかの理由でJSON形式を修正できない場合は、Json.NETの自動DateTime認識と解析を無効にして、DateTimeConverterBaseを継承して独自のcustom JsonConverterを作成する必要があります。

DateParseHandling = DateParseHandling.NoneJsonSerializerSettingsに設定してください。しかし、あなたはあなたの全体的なシリアライザの設定を変更することができない場合は、あなただけ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

関連する問題