Domanda

Ho una cella in un foglio di calcolo che è un oggetto data in Excel, ma diventa un letto (qualcosa di simile a 39.820,0 per 1/7/2009) quando si esce dalla classe xls di C1. Ho letto questo è un formato di data Giuliano. Qualcuno può dirmi come analizzare di nuovo in un DateTime in C #?

Aggiornamento: Sembra che potrei non avere una data di Julian, ma invece il numero di giorni dal 30 dic 1899

.
È stato utile?

Soluzione

Credo che Excel è solo utilizzando l'automazione standard OLE DATA tipo quali possono essere convertiti con il metodo DateTime.FromOADate.

Questo blocco di codice,

using System;

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

uscite:

1/7/2009 12:00:00 AM

Altri suggerimenti

C'è una classe JulianCalendar in System.Globalization; Ecco come si dovrebbe utilizzare:

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

EDIT:

Se è in giorni infatti dal "1900" ecco come si può fare:

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"

Questo numero si presenta come un 'numero di giorni a partire dal 1900' valore.

Quando si tratta di date di Excel, la data può essere la rappresentazione di stringa di una data, o può essere una data di OA. Questo è un metodo di estensione che ho scritto un po 'indietro per aiutare a facilitare la conversione di 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;
}

Basta formattare la cella (s) in questione come Data, utilizzare CTRL + 1, e selezionare il formato desiderato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top