Анализатор даты по Юлианскому календарю C #
-
21-08-2019 - |
Вопрос
У меня есть ячейка в электронной таблице, которая является объектом date в Excel, но становится двойной (что-то вроде 39820.0 для 1/7/2009), когда она выходит из класса xls C1.Я читал, что это юлианский формат даты.Кто-нибудь может сказать мне, как разобрать это обратно в DateTime на C #?
Обновить:Похоже, у меня может быть не юлианская дата, а количество дней, прошедших с 30 декабря 1899 года.
Решение
Я думаю, что Excel просто использует стандартную OLE-автоматизацию Дата тип, который может быть преобразован с помощью 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
Другие советы
В системе есть класс 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"
Это число выглядит как значение "количество дней с 1900 года".
Ознакомьтесь с этим постом: http://dotnet-jeeves.blogspot.com/2006/02/convert-julian-date-to-systemdatetime.html
При работе с датами 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 и выберите нужный формат.