2009-02-04 10 views
1

J'ai une cellule dans un tableur qui est un objet date dans Excel mais devient un double (quelque chose comme 39820.0 pour le 1/7/2009) quand il sort de la classe xls de C1. J'ai lu ceci est un format de date julien. Quelqu'un peut-il me dire comment l'analyser de nouveau dans un DateTime en C#?C# Julian Date Parser

Mise à jour: Il semble que je ne pourrais pas avoir une date Julian, mais le nombre de jours depuis le 30 déc 1899.

Répondre

9

Je pense que Excel est juste en utilisant le type standard OLE Automation DATE qui peut être converti avec la méthode DateTime.FromOADate.

Ce bloc de code,

using System; 

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

sorties:

1/7/2009 12:00:00 AM 
2

Ce numéro ressemble à un « nombre de jours depuis 1900 'valeur.

+0

Je pense que vous pourriez avoir raison, quelle est la bonne façon d'analyser cela? –

8

Il existe une classe JulianCalendar dans System.Globalization; Voici comment vous l'utiliser:

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

EDIT:

Si elle est en jours de fait depuis « 1900 » voici comment vous pouvez le faire:

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

Ressemble à un bon candidat pour une méthode d'extension: DateTime.Since1900 (...) –

+1

Votre fonction renvoie 1/9/2009 pour 39820, mais la question dit 39820 est 1/7/2009. Il s'agit probablement du nombre de jours écoulé depuis le 30/12/1899, vous devriez donc utiliser DateTime (1899,12,30) ou utiliser la réponse de GBegen – Joe

+0

Voici un lien vers plus d'informations sur la classe JulianCalendar de System.Globalization. .. http://msdn.microsoft.com/en-us/library/system.globalization.juliancalendar.aspx –

1

Lorsque vous traitez avec des dates Excel, la date peut être la représentation de chaîne d'une date, ou il peut être une date d'OA. Ceci est une méthode d'extension, j'ai écrit un certain temps pour aider à faciliter la conversion de la date:

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

format Élargi la cellule (s) en question date, utilisez CTRL + 1, et sélectionnez le format de votre choix.