質問
こんにちは
I UTCの日時を表す整数を含むフィールドを持つレガシーデータベースがあります
ドキュメントから: " CDR内のタイムスタンプは、協定世界時(UTC)で表示されます。この値は残ります 夏時間の変更とは無関係
値の例は1236772829です。
私の質問は、UTC値とローカル時間値の両方として、.NET DateTime(DBではなくCLRコード)に変換する最良の方法は何ですか?
Googleを試してみましたが、運はありませんでした。
事前に感謝 /ヨハン
解決
その正確なフレーズをグーグルで検索すると、このCicsoページ、続いて"フィールドは、オペレーティングシステムから取得したtime_t値を指定します。 "
time_t は、厳密に言えば特定のものである必要のないCライブラリの概念です。ただし、UNIX-yシステムの通常は、1970年1月1日00:00のUnixエポックの開始からの秒数になります。
これが正しいと仮定すると、このコードはintからDateTimeを提供します:
DateTime epochStart = new DateTime(1970, 1, 1);
int cdrTimestamp = 1236772829;
DateTime result = epochStart.AddSeconds(cdrTimestamp);
// Now result is 2009 March 11 12:00:29
これらの time_t
の正しい解釈であることを確認するには、取得した結果を健全性チェックする必要があります。
他のヒント
整数の実際の意味を知る必要があります。通常、これは次のもので構成されます。
- エポック/オフセット(つまり、0の意味)-たとえば、「1970年1月1日午前0時」
- スケール、たとえば秒、ミリ秒、ティック。
2つの値を取得でき、UTCでそれらが意味するものであれば、残りは簡単です。最も簡単な方法は、おそらくエポックとして DateTime
(または DateTimeOffset
)を持ち、整数から TimeSpan
を構築することです。 TimeSpan.FromMilliseconds
など。2つを一緒に追加して完了です。編集: AddMilliseconds
を使用する"> aakashmの答えは、このビットを行う簡単な方法です:)
また、自分で計算を行い、 DateTime
コンストラクタは多数のティックを取得します。 (おそらく、 DateTimeKind
を使用するバージョンの方が優れているため、UTCであることを明示的に指定できます。)