14

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

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

Visual Studioで、、、およびその他の同様のものを操作しようとしましたが、どこにも到達していませTimeSpanん。DateTime

4

5 に答える 5

34

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

DateTime.FromOADate(myDouble)
于 2012-12-17T18:15:23.113 に答える
4

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

double d = 40880.051388 ;
DateTime dt = DateTime.FromOADate(d);
于 2012-12-17T18:14:23.253 に答える
3

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

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

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

于 2012-12-17T18:15:27.920 に答える
2

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

new DateTime(1899, 12, 30).AddDays(40880.051388)
于 2012-12-17T18:14:33.787 に答える
0

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

DateTime.FromOADate(myDouble)

ただし、パフォーマンスが重要な場合は、十分な速度で実行されない可能性があります。グレゴリオ暦では、OLEオートメーションの日付形式の日付範囲は1899年12月30日に開始するのに対し、DateTimeは0001年1月1日に開始するため、この操作は非常にプロセッサを集中的に使用します。

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

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

于 2016-04-06T13:49:26.620 に答える