Pergunta

Eu tenho uma célula em uma planilha que é um objeto de data no Excel, mas torna-se um duplo (algo como 39.820,0 para 1/7/2009) quando ele sai da classe xls de C1. Eu li este é um formato de data juliana. Alguém pode me dizer como analisá-lo de volta em um DateTime em C #?

Update: Parece que eu possa não ter uma data Julian, mas em vez disso o número de dias desde 30 de dezembro de 1899

.
Foi útil?

Solução

Eu acho que Excel está apenas usando a automação OLE padrão DATA tipo que pode ser convertida com o método DateTime.FromOADate.

Este bloco de código,

using System;

namespace DateFromDouble
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.FromOADate(39820.0));
        }
    }
}

saídas:

1/7/2009 12:00:00 AM

Outras dicas

Há uma classe JulianCalendar em System.Globalization; Veja como você iria utilizá-lo:

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

EDIT:

Se é em dias de fatos, já que "1900" é aqui como você pode fazê-lo:

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"

Esse número parece um 'número de dias desde 1900' valor.

Ao lidar com datas do Excel, a data pode ser a representação em cadeia de uma data, ou pode ser uma data OA. Este é um método de extensão Eu escrevi um tempo atrás para ajudar a facilitar a conversão de data:

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

Apenas formatar a célula (s) em questão como data, use CTRL + 1, e selecione o seu formato desejado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top