我在电子表格中有一个单元格,它是Excel中的日期对象,但当它出自C1的xls类时,变成了双重(类似于39820.0 for 1/7/2009)。我读到这是朱利安的日期格式。有人能告诉我如何将它解析回C#中的DateTime吗?
更新:看起来我可能没有朱利安日期,而是自1899年12月30日以来的天数。
答案 0 :(得分:9)
我认为Excel只是使用标准的OLE自动化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
答案 1 :(得分:8)
System.Globalization中有一个JulianCalendar类;以下是您将如何使用它:
JulianCalendar c = new JulianCalendar();
DateTime time = c.ToDateTime(2009, 1, 7, 0, 0, 0, 0);
Console.WriteLine(time.ToShortDateString());
编辑:
如果实际上是“1900”以后的几天,你可以这样做:
public static DateTime DaysSince1900(int days)
{
return new DateTime(1900, 1, 1).AddDays(days);
}
DateTime time = DaysSince1900(39820);
Console.WriteLine(time.ToShortDateString()); //will result in "1/9/2009"
答案 2 :(得分:2)
这个数字看起来像'自1900年以来的天数'。
答案 3 :(得分:1)
答案 4 :(得分:1)
答案 5 :(得分:1)
处理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;
}
答案 6 :(得分:1)
有两种方法可以进行此转换-
OLE自动化日期方法-
double doubleDate = 43153.0;
DateTime normalDate = DateTime.FromOADate(doubleDate);
/* {2/22/2018 12:00:00 AM} */
DateAdd()方法,使用此方法,您可以指定要转换为的日期类型
double doubleDate = 43153.0;
DateTime normalDate = new DateTime(1899, 12, 30, 0, 0, 0, DateTimeKind.Utc).AddDays(doubleDate);
/* {2/22/2018 12:00:00 AM} */
注意:此日期常量{1899年12月31日12h}被称为Julian Day
中的都柏林朱利安日答案 7 :(得分:0)
只需将相关单元格格式化为日期,使用CTRL + 1,然后选择所需的格式。