2017-05-17 9 views
0

私は、サーバーからアラートを受け取るアプリケーションを開発中です。アラートを処理している間、私は最後の時間を計算し、アラートは次のようにして送信された:それは私が、サーバーがアクティブであるかどうかを把握することができますので、DateTime.NowとDateTime.Utcの標準化

TimeSpan? alertDiffTimespan = DateTime.UtcNow - serverEventInfo.lastAlert 

正確なタイムスパンが重要です。

遅くとも、serverEventInfo.lastAlertが正しく(つまり、DateTime.UtcNowとしてフォーマットされている)、現在の時間よりも1時間遅れている(DateTime.Nowなど)ことがあることに気付きました。私は、次の試してみました:

TimeSpan? alertDiffTimeSpan = DateTime.UtcNow - serverEventInfo.lastAlert.Value.ToUniversalTime() 

をしかし、それはすべての値がDateTime.UtcNowとして設定されていることに来て正しくフォーマットされているが、DateTime.Nowとして設定されたものが正しいことを意味します。

私はDateTime.Kindも同様に判断しようとしましたが、毎回Unspecifiedとしてフラグを立てていますので、違いはありません。

私がどんなにがUtcNowまたはNow値が入ってくるかどうか、私はまだそれを正しく処理し、正しいalertDiffTimeSpanを得ることができるように自分のアプリケーションの中に入ってくるのDateTime値を標準化するために何かできることはありますか?

日付は{0:MM/dd/yyyy hh:mm:ss tt}の形式で、String.Format("{0:MM/dd/yyyy hh:mm:ss tt}", DateTime.Now)またはString.Format("{0:MM/dd/yyyy hh:mm:ss tt}", DateTime.UtcNow)と設定されています。

+2

どのような形式でdatetimesを受信して​​いますか?彼らがUTCかどうかを指定しなければ、自分で推測できる方法はありません。 – Rob

+0

https://xkcd.com/1179/は唯一の受け入れ可能な回答です...(しかし、情報が不足しているポストがどこから来ているかを知ることは非常に難しいです) –

+0

'DateTime.Now'!=' DateTime。 Utc(今) '前者は現地時間(機械の地域設定に基づく)に調整され、後者はISO 8601形式を使用します。異なるタイムゾーンでユーザーの入力を処理する最も安全な方法は、最初にISO形式に変換してからローカルのものとして表示することです。 –

答えて

3

タイムゾーン情報が何らかの方法で指定されていないと、正しいDateTime値を推測できません。サーバーはローカル(おそらく複数のタイムゾーン)とUTCの間を「ランダムに」選ぶかもしれないし、どちらがどれであるかを知る方法がないように思えます。

修正:

  • 整列すべてのサーバがUTC時刻を返すとタイムゾーンを指定しない形式を使用して続行します。サーバーの値を読み取るときにUtcを最後に指定する場合:DateTime.SpecifyKind(parsedDateTime, DateTimeKind.Utc)
  • シリアル化されたデータにタイムゾーン情報が必要です。好ましくは同様にフルISO8601を使用「:27:2017-05-17T08 27.0314698Z」(dateTime.ToString("o")、より多くの情報 - Given a DateTime object, how do I get an ISO 8601 date in string format?、またはあなたのより多くの写真のような場合 - https://xkcd.com/1179/

は、カルチャ固有のある任意のフォーマットを使用しないでください。 (デフォルトのToString()のように)すべてのサーバーが同じロケール設定で構成されており、解析コードが常に値を読み取るときに同じカルチャを指定していない場合は、シリアル化されたデータになります。再びISO8601がより安全な選択肢です。

関連する問題