Pregunta

Tengo una celda de una hoja de cálculo que es un objeto de fecha en Excel, pero se convierte en una doble (algo así como 39820.0 para 1/7/2009) cuando se trata de la clase C1 de xls. He leído este es un formato de fecha juliana. ¿Puede alguien decirme cómo analizar de nuevo en un DateTime en C #?

Actualización: Parece que yo no tuviese una fecha juliana, pero en cambio el número de días desde el 30 de Dic, 1899

.
¿Fue útil?

Solución

Creo Excel es sólo con el estándar de automatización OLE FECHA tipo que se puede convertir con el método DateTime.FromOADate.

Este bloque de código,

using System;

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

salidas:

1/7/2009 12:00:00 AM

Otros consejos

Hay una clase JulianCalendar en System.Globalization; He aquí cómo usted lo utilizaría:

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

EDIT:

Si es en días de hecho ya que "1900" He aquí cómo usted puede hacerlo:

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"

Ese número se parece a un 'número de días desde el año 1900' valor.

Cuando se trata de fechas de Excel, la fecha puede ser la representación de cadena de una fecha, o puede ser una fecha de OA. Este es un método de extensión que escribí hace un tiempo para ayudar a facilitar la conversión de la fecha:

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

Al igual formato a la celda (s) en cuestión como fecha, utilice CTRL + 1, y seleccionar el formato deseado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top