2017-05-25 6 views
0

に正しい日付と時刻を解析できませんでした私はこのようなjsonを返すサービスがあります。は、C#:現在のシステムのタイムゾーン

[ 
    { 
     "title":"First event", 
     "startDate":"\/Date(1495512000000-0400)\/", 
     "endDate":"\/Date(1495857540000-0400)\/", 
    } 
] 

を私がモデルに関してリストにJSON出力をデシリアライズ私が定義されています:

モデルdeseriaの

public class EventModel 
{ 
    [JsonProperty("title")] 
    public string Title { get; set; } 

    [JsonProperty("startDate")] 
    public DateTime StartDate { get; set; } 

    [JsonProperty("endDate")] 
    public DateTime EndDate { get; set; } 
} 

C#のコードをライゼーション

デシリアライズ用にNewtonsoft.Jsonパッケージを使用しています。

List<EventModel> lstEvent = new List<EventModel>(); 
lstEvent = JsonConvert.DeserializeObject<List<EventModel>>(await objMyServices.GetData()); 

だから私は私は2つの異なるタイムゾーンで次のような出力を得るデバッグこの場合:30(コルカタ - インド):GMT + 5の場合

開始時間:23 -05-2017 9時30分00秒

終了時間:27-05-2017については午前9時29分00秒

GMT-4:00(ニューヨーク):

開始時間:23-05-2017午後12時00分00秒

終了時間:すべてのレコードのため26-05-2017午後11時59分00秒

、開始時刻がに解析されていませんGMT-4:00(ニューヨーク)に切り替えると、それぞれのシステムのタイムゾーンになります。 ここで私が紛失していることは何ですか?

+0

これはJsonの日付ではありません。 JSonの日付はISO8601に従ってフォーマットされます。これはAJAX時代の非常に古い形式です。 –

+0

さらに、LocalTime、UTCまたはUndefinedのDateTimeを使用しています。返される日付のDateTimeKindプロパティは何ですか?同じUTC時間は、ニューヨークでローカルに変換された場合には異なって表示されますが、それでもまだ同じです。使用するDateTimeKindを明示的に指定しないと、表示されるときにも異なるように表示されます。 –

+0

@PanagiotisKanavos - ISO8601を使用する必要がありますが、何も必要なものはありません。https:// stackoverflow。com/questions/10286204/the-right-json-date-format – CodeNaked

答えて

1

Json.NETでは、DateTimeZoneHandlingシリアライザ設定で返されるDateTimeの種類(UTC、ローカル)を指定できます。デフォルトはLocalです。

は、UTCのDateTimeを返し使用するにはDateTimeZoneHandling.Utc:

var settings = new Newtonsoft.Json.JsonSerializerSettings() 
       { 
        DateTimeZoneHandling = DateTimeZoneHandling.Utc 
       }; 
var content=await objMyServices.GetData(); 
var lstEvent = JsonConvert.DeserializeObject<List<EventModel>>(content, settings); 

は、おそらくより良いオプションは、のDateTimeOffsetにプロパティタイプを変更することです。このタイプは元のオフセットを保持します。

+0

プロパティをDateTimeOffsetに変更したとき、私は時間を得ていません。出力は:StartDate {23-05-2017 00:00:00 -04:00} –

+0

実際の値、 '23-05-2017 00:00:00 -04:00'ではないですか?そして2番目のものは '26-05-2017 23:59:00 -04:00'ですか? –

+0

はい、どうすれば現地の時間と日付を取得できますか?以来、それはUTCです。デバイスのカレンダーに現地日時のイベントを追加する必要があります。 –

0

Web APIでTicksを使用できます。これは、複数のタイムゾーンで作業しているときに非常に便利です。以下の例を参照してください。

DateTime.UtcNow.Ticks 
関連する問題