2017-01-05 2 views
-5

J'ai une tâche d'entrevue à faire. J'ai besoin de calculer le nombre de dates entre les dates SANS utiliser les classes Date/DateTime/TimeSpan pour le faire.C# Comment calculer les jours entre les dates sans utiliser Date/DateTime/TimeSpan?

Comment faire cela en utilisant uniquement la classe String?

Cordialement // vamone

+0

'CHAINE' seulement? Vous ne pouvez même pas utiliser 'int'? Aussi, si vous nous montrez une tentative, vous avez plus de chances d'obtenir de l'aide. – juharr

+0

Je suis désolé j'étais malpropre. J'ai une date sous forme de chaîne au format "1/5/2017" par exemple. – vamone

+0

Est-ce que l'intervieweur veut savoir si vous êtes capable de faire des tâches absurdes sans vous révolter? – Ralf

Répondre

0

Il est plus normal de convertir votre date en a Julian day number:

// This is a standard formula for conversion. 
// See the Wikipedia page on Julian days for more information. 

public static long ToJulian(int year, int month, int day) 
{ 
    if (month < 3) 
    { 
     month = month + 12; 
     year = year - 1; 
    } 

    return day + (153 * month - 457)/5 + 365 * year + (year/4) - (year/100) + (year/400) + 1721119; 
} 

Pour appeler que vous devez d'abord analyser votre chaîne de date dans le mois, le jour et l'année:

public static long ToJulian(string mdy) 
    { 
     var split = mdy.Split('/'); 
     return ToJulian(int.Parse(split[2]), int.Parse(split[0]), int.Parse(split[1])); 
    } 

Ensuite, vous pouvez convertir les deux dates en format julien et soustrayez-les pour trouver la différence en jours.

Voici un exemple qui montre que le résultat est le même par rapport à l'utilisation Julian DateTime et TimeSpan:

static void Main() 
    { 
     string date1 = "5/31/1961"; 
     string date2 = "1/5/2017"; 

     long diff1 = ToJulian(date2) - ToJulian(date1); 

     Console.WriteLine("diff1 = " + diff1); 

     long diff2 = (long)(
      DateTime.Parse(date2, CultureInfo.InvariantCulture) - 
      DateTime.Parse(date1, CultureInfo.InvariantCulture)) 
      .TotalDays; 

     Console.WriteLine("diff2 = " + diff2); 
    } 
+0

Il est à noter que 'ToJulian' ne produit pas de résultats valides avant 0000-03-01. –

0

Vous ne pouvez pas sans savoir quelle culture la date est liée à.

Vous devez d'abord savoir de quelle culture nous parlons, puis vous pouvez identifier les séparateurs et les parties de date avec l'objet DateFormat.

Ensuite, utilisez simplement la méthode Split en séparant les dates, de sorte que vous puissiez récupérer chaque partie Date et effectuer vos calculs.

Mais vous devez également définir la durée des mois (28 jours, 30 jours, 31 jours), sans mentionner les années bissextiles.

Pour déterminer leap-years vous pouvez mettre en œuvre l'algorithme suivant

si (année est non divisible par 4) alors (il est une année commune)
autre si (année est pas divisible par 100) puis (c'est une année bissextile)
sinon si (année non divisible par 400) puis (il est une année commune)
autre (il est une année bissextile)

Pendant des mois, la durée déclarer un tableau de douze articles pour stocker mois la durée et utiliser le numéro de mois comme un indice de récupérer la longueur de chaque mois.