web-dev-qa-db-ja.com

double値をC#でDateTimeに変換する方法は?

値40880.051388があり、それをdoubleとして格納しています。Excelを開いてセルに貼り付け、次のカスタム形式「m/d/yyyy h:mm"」をそのセルに適用すると、"12/3/2011 1:14"が得られます

C#でこの解析/変換を行うにはどうすればよいですか?値がエポック時間などの特定のチェックポイントからのミリ秒であるかどうか、または値が特定の準備された形式であるかどうかはわかりませんが、Excelはどのようにこの特定の値を考え出しますか? C#で実行できますか?

Visual StudioでTimeSpanDateTimeなどを操作してみましたが、どこにも到達しません。

11
fifamaniac04

古い OLEオートメーション日付 を使用しているようです。使用する

DateTime.FromOADate(myDouble)
31
Jaime Torres

このようなものを試してください:-

double d = 40880.051388 ;
DateTime dt = DateTime.FromOADate(d);
4
Rahul Tripathi

この値は、1899年12月30日からの日数でのオフセットです。

new DateTime(1899, 12, 30).AddDays(40880.051388)
2
Cory Nelson

var dateTime = DateTime.FromOADate(40880.051388);を使用してみてください。

文字列にフォーマットする必要がある場合は、dateTime.ToString("M/d/yyyy H:mm", CultureInfo.InvariantCulture)を使用してください。これにより、24時間の文字列が得られます(12時間システムの場合、Hhに変更します)。

FromOADateで提供されるよりも高い精度(1000倍以上)が必要な場合は、 別のスレッドでの私の回答 を参照してください。

2

次の簡単なコードが機能します

DateTime.FromOADate(myDouble)

ただし、パフォーマンスが重要な場合は、十分な速度で実行されない可能性があります。 OLEオートメーション日付形式の日付範囲は1899年12月30日から始まり、グレゴリオ暦では0001年1月1日から始まります。

FromOADateは、myDoubleを唯一の引数として使用してDoubleDateToTicks関数を呼び出します。これはティックの数を返し、この値は未指定のDateTimeKindで新しいDateTimeを作成するために使用されます。

この作業の大部分は、mscorlibのDoubleDateToTicks関数によって行われます。これには、doubleの値がNaNである場合にArgumentExceptionをスローするコードが含まれ、ニーズに応じてパフォーマンスを最適化する方法は多数あります。

0