| 

.NET C# Java Javascript Exception

0
Hallo,
ich möchte in C# (.net) einen Zeitraum zwischen zwei Datum formatiert ausgeben.
Beispiel: 01.03.2009 und 15.05.2010 soll einen String ergeben der ausgibt:

1 Jahr, 2 Monate und 14 Tage

Dabei soll natürlich NICHT vereinfachend ein Monat aus 30 Tagen und ein Jahr aus 365 Tagen bestehen. Es sollen die tatsächlichen Jahre, Monate und Tage ausgegeben werden.

Gibt es dafür einen "schicken" Weg? Alle meine Versuche laufen auf umfangreiches herumrechnen und herumformatieren raus - da hätte ich gerne einen schöneren Weg gefunden.
22.04.2010
DerKleineNils 79 5
3 Antworten
0
Ich würde den Modulo Operator dafür verwenden.
"Herumformatieren" muss man hier eigentlich nichts.

DateTime startTime = new System.DateTime(2009, 3, 1, 0, 0, 0);
DateTime endTime = new System.DateTime(2010, 5, 15, 0, 0, 0);
TimeSpan diff = endTime.Subtract(startTime);

int restTage, restMonate = 0;

restTage = diff.Days % 365;
restMonate = restTage % 12;

Console.WriteLine("{0} {1} {2} ", diff.Days / 365 + " Jahre", restMonate + " Monate", restTage + " Tage");


Ausgabe: 1 Jahre 3 Monate 75 Tage

Das mit den Jahr(e), Tag(e) und Monat(e) muss natürlich noch schön machen : )
22.04.2010
Mario Priebe 5,8k 2 9
restTage = diff.Days % 365;
kann aber Fehler geben bei Schaltjahren
DaSpors 22.04.2010
Schaltjahr ja, das ist mir auch während der Heimfahrt eingefallen : )
Mario Priebe 24.04.2010
passend dazu, natürlich hier noch eine kleine HelperMethod: http://www.biggle.de/blog/schaltjahr-methode-quicky-c
Mario Priebe 24.04.2010
Genau das (1 Monat = 30 Tage) wollte ich ja eben nicht.
DerKleineNils 26.04.2010
0
Schließe mich Mario an, aber um Schaltjahre richtig zu berücksichtigen muss schon etwas mehr Berechnung stattfinden.
Hier gibt es Beispielcode wie Monate und Jahre zu berechnen sind. TimeSpan wird dann für 'den Rest' genutzt.
Der Code aus dem Posting oben leicht modifiziert (difference brauchst Du eigentlich nicht mehr):
DateTime date1 = dateTimePicker1.Value;
DateTime date2 = dateTimePicker2.Value;

int oldMonth = date2.Month;
while (oldMonth == date2.Month)
{
date1 = date1.AddDays(-1);
date2 = date2.AddDays(-1);
}
int years = 0, months = 0, days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0;

// getting number of years
while (date2.CompareTo(date1) >= 0)
{
years++;
date2 = date2.AddYears(-1);
}
date2 = date2.AddYears(1);
years--;

// getting number of months and days
oldMonth = date2.Month;
while (date2.CompareTo(date1) >= 0)
{
days++;
date2 = date2.AddDays(-1);
if ((date2.CompareTo(date1) >= 0) && (oldMonth != date2.Month))
{
months++;
days = 0;
oldMonth = date2.Month;
}
}
date2 = date2.AddDays(1);
days--;

TimeSpan difference = date2.Subtract(date1);

Console.WriteLine("{0} {1} {2} ", years + " Jahre", months + " Monate", days + " Tage");
22.04.2010
DaSpors 4,1k 1 8
Nicht schön, aber funktioniert ;) Das Ganze als Klasse verkapselt wäre natürlich besser!
DaSpors 22.04.2010
Ist schon mal ein guter Ansazt. Die Schleifen mögen mir aber irgendwie gar nicht so recht gefallen...
DerKleineNils 26.04.2010
-1
Danke für Eure Ideen - aber manches wirkt für mich unschön. Darum habe ich mich übers Wochenede mal hingesetzt und selbst was entwickelt. Hier ist das Resultat.
Die formatierte Ausgabe habe ich erst mal weggelassen...

/// <summary>
/// Berechnet den Zeitraum zwischen zwei Datum und gibt die Tage,Monate und Jahre als Int zurück.
/// Berücksichtigt dabei Schaltjahre und 31/30/28 Tage pro Monat
/// </summary>
public void GetZeitraum(DateTime von, DateTime bis, out int tage, out int monate, out int jahre)
{
DateTime vonDatum = von;
DateTime bisDatum = bis;
if (von > bis)
{
vonDatum = bis;
bisDatum = von;
}

tage = bisDatum.Day - vonDatum.Day;
monate = bisDatum.Month - vonDatum.Month;
jahre = bisDatum.Year - vonDatum.Year;

if (tage < 0)
{
monate--;
DateTime hilfsdatum = new DateTime(bisDatum.Year, bisDatum.Month, vonDatum.Day);
hilfsdatum = hilfsdatum.AddMonths(-1);
TimeSpan dif = bisDatum - hilfsdatum;
tage = dif.Days;
}

if (monate <0)
{
monate = monate +12;
jahre--;
}
}
26.04.2010
DerKleineNils 79 5
Leider hast du auch in deiner Lösung das Schaltjahr nicht mit beachtet.
Mario Priebe 28.04.2010
Doch habe ich - probiers aus.
DerKleineNils 28.04.2010

Stelle deine .net-Frage jetzt!