C # Julian Date Parser - PullRequest
       14

C # Julian Date Parser

1 голос
/ 04 февраля 2009

У меня есть ячейка в электронной таблице, которая является объектом даты в Excel, но становится двойной (что-то вроде 39820.0 для 1/7/2009), когда она выходит из класса xls C1. Я читал, что это юлианский формат даты. Может кто-нибудь сказать мне, как разобрать его обратно в DateTime в C #?

Обновление: похоже, у меня может быть не юлианская дата, а число дней с 30 декабря 1899 года.

Ответы [ 7 ]

9 голосов
/ 05 февраля 2009

Я думаю, что 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
8 голосов
/ 04 февраля 2009

В System.Globalization есть класс JulianCalendar; Вот как вы бы это использовали:

            JulianCalendar c = new JulianCalendar();
            DateTime time = c.ToDateTime(2009, 1, 7, 0, 0, 0, 0);
            Console.WriteLine(time.ToShortDateString());

EDIT:

Если это действительно дни с 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 голосов
/ 04 февраля 2009

Это число выглядит как значение «количество дней с 1900 года».

1 голос
/ 19 апреля 2010

При работе с датами 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;
}
1 голос
/ 19 апреля 2010
1 голос
/ 04 февраля 2009
0 голосов
/ 20 ноября 2014

Просто отформатируйте соответствующие ячейки в качестве даты, используйте CTRL + 1 и выберите нужный формат.

...