2009-02-04 4 views
1

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

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

ответ

9

Я думаю, что 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 
2

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

+0

Я думаю, что вы можете быть правы, каков правильный способ разобрать это? –

8

В классе 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" 
+0

Похоже, хороший кандидат на метод расширения: DateTime.Since1900 (...) –

+1

Ваша функция возвращает 1/9/2009 для 39820, но вопрос говорит, что 39820 - 1/7/2009. Вероятно, на самом деле это число дней с 12/30/1899, поэтому вы хотите использовать DateTime (1899,12,30) или использовать ответ GBegen – Joe

+0

Вот ссылка на дополнительную информацию о классе JulianCalendar System.Globalization. .. http://msdn.microsoft.com/en-us/library/system.globalization.juliancalendar.aspx –

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; 
} 
0

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

Смежные вопросы