Excel の日付オブジェクトであるスプレッドシートにセルがありますが、C1 の xls クラスから出ると double (2009 年 1 月 7 日の 39820.0 のようなもの) になります。これはユリウス日付形式であると読みました。C# でそれを解析して DateTime に戻す方法を教えてもらえますか?
更新: ユリウス日ではなく、1899 年 12 月 30 日からの日数のようです。
Excel の日付オブジェクトであるスプレッドシートにセルがありますが、C1 の xls クラスから出ると double (2009 年 1 月 7 日の 39820.0 のようなもの) になります。これはユリウス日付形式であると読みました。C# でそれを解析して DateTime に戻す方法を教えてもらえますか?
更新: ユリウス日ではなく、1899 年 12 月 30 日からの日数のようです。
Excelは、メソッドで変換できる標準のOLE Automation DATE型を使用しているだけだと思います。DateTime.FromOADate
このコードブロック、
using System;
namespace DateFromDouble
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.FromOADate(39820.0));
}
}
}
出力:
1/7/2009 12:00:00 AM
Excel の日付を扱う場合、日付は日付の文字列表現である場合もあれば、OA の日付である場合もあります。これは、日付変換を容易にするために、私がしばらく前に書いた拡張メソッドです。
/// <summary>
/// Sometimes the date from Excel is a string, other times it is an OA Date:
/// Excel stores date values as a Double representing the number of days from January 1, 1900.
/// Need to use the FromOADate method which takes a Double and converts to a Date.
/// OA = OLE Automation compatible.
/// </summary>
/// <param name="date">a string to parse into a date</param>
/// <returns>a DateTime value; if the string could not be parsed, returns DateTime.MinValue</returns>
public static DateTime ParseExcelDate( this string date )
{
DateTime dt;
if( DateTime.TryParse( date, out dt ) )
{
return dt;
}
double oaDate;
if( double.TryParse( date, out oaDate ) )
{
return DateTime.FromOADate( oaDate );
}
return DateTime.MinValue;
}
問題のセルを日付としてフォーマットし、CTRL + 1 を使用して、目的のフォーマットを選択するだけです。