C# :: Aufgabe #50
8 Lösungen

Zeit zwischen zweier Tage
Anfänger - C#
von Dome
- 10.03.2013 um 23:50 Uhr
Erstellen Sie ein Programm, mit dem man die Zeitdifferenz zwischen zwei Tagen bestimmen kann. Hierzu muss man beide Tage eingeben und das Programm gibt die Zeitdifferenz aus.
Je nach Schwierigkeitsgrad:
Eingabe der Daten per Konsole oder GUI, eine Art Dropdown-Menü oder ähnliches
Ausgabe der Differenz in mehreren "Zeitformen", Tage, Monate, Jahre, Minuten, Stunden
Eingabe von Uhrzeiten, die jeweils in die Berechnung einfließen
Je nach Schwierigkeitsgrad:
Eingabe der Daten per Konsole oder GUI, eine Art Dropdown-Menü oder ähnliches
Ausgabe der Differenz in mehreren "Zeitformen", Tage, Monate, Jahre, Minuten, Stunden
Eingabe von Uhrzeiten, die jeweils in die Berechnung einfließen
Lösungen:

Console.Write("Bitte geben Sie den ersten Tag an: "); var firstDay = Console.ReadLine(); Console.Write("Bitte geben Sie den zweiten Tag an: "); var secondDay = Console.ReadLine(); Console.Write("Bitte geben Sie die Zeitdifferenz an, die ermittelt werden soll (1 = Tage, 2 = Monate, 3 = Jahre, 4 = Minuten, 5 = Stunden: "); var timeChoice = Console.ReadLine(); var begin = DateTime.Parse(firstDay); // Hier wird bei falschem Format eine Exception geworfen var end = DateTime.Parse(secondDay); // Hier wird bei falschem Format eine Exception geworfen TimeSpan t; if (begin <= end) t = end - begin; else t = begin - end; switch (timeChoice) { case "1": Console.WriteLine("Zwischen dem {0} und dem {1} sind {2} Tage.", firstDay, secondDay, t.TotalDays); break; case "2": { int months = 0; DateTime t1, t2; if (begin < end) { t1 = begin; t2 = end; } else { t2 = begin; t1 = end; } while ((t1.Month < t2.Month && t1.Year == t2.Year) || t1.Year < t2.Year) { months++; t1 = t1.AddMonths(1); } Console.WriteLine("Zwischen dem {0} und dem {1} sind {2} Monate.", firstDay, secondDay, months); break; } case "3": { int years = 0; DateTime t1, t2; if (begin < end) { t1 = begin; t2 = end; } else { t2 = begin; t1 = end; } while (t1.Year < t2.Year) { years++; t1 = t1.AddYears(1); } Console.WriteLine("Zwischen dem {0} und dem {1} sind {2} Jahre.", firstDay, secondDay, years); break; } case "4": Console.WriteLine("Zwischen dem {0} und dem {1} sind {2} Minuten.", firstDay, secondDay, t.TotalMinutes); break; case "5": Console.WriteLine("Zwischen dem {0} und dem {1} sind {2} Stunden.", firstDay, secondDay, t.TotalHours); break; default: throw new ArgumentOutOfRangeException(); } Console.ReadKey();

using System; using System.Windows.Forms; namespace Zeitdifferenz { public partial class Form1 : Form { public Form1() { InitializeComponent(); zeitformen.Items.Add("Tage"); zeitformen.Items.Add("Monate"); zeitformen.Items.Add("Jahre"); zeitformen.Items.Add("Stunden"); zeitformen.Items.Add("Minuten"); zeitformen.SelectedItem = "Tage"; } private void zeitformen_SelectedIndexChanged(object sender, EventArgs e) { if (zeitformen.SelectedItem.ToString() == "Stunden" || zeitformen.SelectedItem.ToString() == "Minuten") { datumVon.Format = DateTimePickerFormat.Time; datumBis.Format = DateTimePickerFormat.Time; } else { datumVon.Format = DateTimePickerFormat.Long; datumBis.Format = DateTimePickerFormat.Long; } } private void berechnen_Click(object sender, EventArgs e) { if (datumVon.Value.CompareTo(datumBis.Value) <= 0) switch (zeitformen.SelectedItem.ToString()) { case "Tage": differenz.Text = Convert.ToInt32(datumBis.Value.Subtract(datumVon.Value).TotalDays).ToString(); break; case "Monate": int month = 0; DateTime temp = datumVon.Value; while (temp.CompareTo(datumBis.Value) < 0) { month++; temp = temp.AddMonths(1); } if (month != 0) month--; differenz.Text = month.ToString(); break; case "Jahre": differenz.Text = (datumBis.Value.Year - datumVon.Value.Year).ToString(); break; case "Stunden": differenz.Text = Convert.ToInt32(datumBis.Value.Subtract(datumVon.Value).TotalHours).ToString(); break; case "Minuten": differenz.Text = Convert.ToInt32(datumBis.Value.Subtract(datumVon.Value).TotalMinutes).ToString(); break; default: MessageBox.Show("Keine gültige Zeitform gewählt"); break; } else MessageBox.Show("Von Datum liegt nach Bis Datum."); } private void abbrechen_Click(object sender, EventArgs e) { System.Environment.Exit(0); } } }

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Zeitdifferenz { class Program { static void Main() { Console.WriteLine("Geben Sie das niedrigere Datum ein in dd.mm.yyyy hh:MM ein:"); DateTime datum1 = DateTime.Parse(Console.ReadLine()); Console.WriteLine("Geben Sie das höhre Datum ein:"); DateTime datum2 = DateTime.Parse(Console.ReadLine()); int jahre = datum2.Year - datum1.Year; DateTime datum = datum1.AddYears(jahre); if (datum > datum2) { jahre--; datum = datum1.AddYears(jahre); } int monate = datum2.Month - datum1.Month; if (datum2.Day < datum1.Day) monate--; monate = (monate + 12) % 12; datum = datum.AddMonths(monate); int tage = (datum2 - datum).Days; int stunden = (datum2 - datum).Hours; int minuten = (datum2 - datum).Minutes; TimeSpan diff = datum2 - datum1; Console.WriteLine("Die Zeitdifferenz ist {0} Jahre, {1} Monate, {2} Tage, {3} Stunden, {4} Minuten", jahre.ToString(), monate.ToString(), tage.ToString(),stunden.ToString(),minuten.ToString()); Console.WriteLine("in Jahre: {0}", jahre); Console.WriteLine("in Monate: {0}", jahre * 12 + monate); Console.WriteLine("in Tage: {0}", diff.TotalDays); Console.WriteLine("in Stunden: {0}", diff.TotalHours); Console.WriteLine("in Minuten: {0}", diff.TotalMinutes); Console.ReadLine(); } } }

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ZeitZwischenZweiTagen { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int anzahlJahre, jahr_1, jahr_2, anzahlMonate=0, monat_1, monat_2, tage, stunden, minuten; monat_1 = dateTimePicker5.Value.Month; monat_2 = dateTimePicker6.Value.Month; jahr_1 = dateTimePicker5.Value.Year; jahr_2 = dateTimePicker6.Value.Year; if (dateTimePicker5.Value.Date < dateTimePicker6.Value.Date) { while (monat_1 != monat_2 || jahr_1 != jahr_2) { if (monat_1 == 12) // Ein nächstes Jahr wird erreicht { // Dezember zu monat_1 = 0; // Januar jahr_1++; } anzahlMonate++; monat_1++; } anzahlJahre = anzahlMonate / 12; // Bsp.: 8.8.15 - 8.1.16 -> Kein komplettes Jahr dazwischen tage = Convert.ToInt32(dateTimePicker6.Value.Date.Subtract(dateTimePicker5.Value.Date).TotalDays); stunden = Convert.ToInt32(dateTimePicker6.Value.Date.Subtract(dateTimePicker5.Value.Date).TotalHours); minuten = Convert.ToInt32(dateTimePicker6.Value.Date.Subtract(dateTimePicker5.Value.Date).TotalMinutes); } else { while (monat_1 != monat_2 || jahr_1 != jahr_2) { if (monat_2 == 12) { monat_2 = 0; jahr_2++; } anzahlMonate++; monat_2++; } anzahlJahre = anzahlMonate / 12; tage = Convert.ToInt32(dateTimePicker5.Value.Date.Subtract(dateTimePicker6.Value.Date).TotalDays); stunden = Convert.ToInt32(dateTimePicker5.Value.Date.Subtract(dateTimePicker6.Value.Date).TotalHours); minuten = Convert.ToInt32(dateTimePicker5.Value.Date.Subtract(dateTimePicker6.Value.Date).TotalMinutes); } label2.Text = "Jahre: " + Convert.ToString(anzahlJahre); label3.Text = "Monate: " + Convert.ToString(anzahlMonate); label4.Text = "Tage: " + Convert.ToString(tage); label5.Text = "Stunden: " + Convert.ToString(stunden); label6.Text = "Minuten: " + Convert.ToString(minuten); } private void button2_Click(object sender, EventArgs e) { label2.Text = "Jahre:"; label3.Text = "Monate:"; label4.Text = "Tage:"; label5.Text = "Stunden:"; label6.Text = "Minuten:"; } } }
Eine Windows Forms-Lösung mit DateTimePickern und TextBoxen für die Uhrzeit: Anzeige in Tagen, Monaten, Jahren, Stunden, Minuten, Sekunden und Millisekunden :)
C#-Code

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Übungen_Zu_CSharp_50 { /// <summary> /// Ich habe hier mit DateTimePickern (mC_left und mC_right) für das Datum /// und TextBoxen für die Uhrzeit gearbeitet. /// Anstelle von meinen return-Anweisungen bei der Berechnung könnte man auch Message-Boxen mit den Fehlern aufploppen lassen. /// </summary> public partial class Form1 : Form { DateTime date1 = new DateTime(); DateTime date2 = new DateTime(); string ausgabe = ""; public Form1() { InitializeComponent(); //Es kann nur ein Datum ausgewählt werden pro DateTimePicker mC_left.MaxSelectionCount = 1; mC_right.MaxSelectionCount = 1; } //Einlesen des von-Datums und dieses im Label anzeigen private void mC_left_DateSelected(object sender, DateRangeEventArgs e) { date1 = mC_left.SelectionRange.Start; mC_left.Visible = false; lbl_date1.Text = date1.ToString(@"d\.MM\.yyyy"); } //Einlesen des bis-Datums und dieses im Label anzeigen private void mC_right_DateSelected(object sender, DateRangeEventArgs e) { date2 = mC_right.SelectionRange.Start; mC_right.Visible = false; lbl_date2.Text = date2.ToString(@"d\.MM\.yyyy"); } //Anzeigen der DateTimePicker zum Platzsparen private void lbl_date1_Click(object sender, EventArgs e) { if (mC_left.Visible == false) { mC_left.Visible = true; } else { mC_left.Visible = false; } } private void lbl_date2_Click(object sender, EventArgs e) { if (mC_right.Visible == false) { mC_right.Visible = true; } else { mC_right.Visible = false; } } //Berechnen der Differenz private void btn_berechnen_Click(object sender, EventArgs e) { ausgabe = ""; TimeSpan zeit1Time; TimeSpan zeit2Time; TimeSpan zeitDiff = new TimeSpan(0, 0, 0); TimeSpan dateDiff = date2.Subtract(date1); //Wenn das von-Datum nach dem bis-Datum liegt -> return if (dateDiff < new TimeSpan(0, 0, 0, -1)) return; //Konvertierung vom TextBox Inhalt in TimeSpan string[] zeit1 = txtBox_date1.Text.Split(':'); string[] zeit2 = txtBox_date2.Text.Split(':'); //return wenn falsches Format if (zeit1.Length < 3 || zeit1.Length > 3 || zeit2.Length < 3 || zeit2.Length > 3) return; //Wenn Standardinhalt ist die Zeitdifferenz 0 if(txtBox_date1.Text == "hh:mm:ss" || txtBox_date2.Text == "hh:mm:ss") { zeit1Time = new TimeSpan(0, 0, 0); zeit2Time = new TimeSpan(0, 0, 0); } else { try { zeit1Time = new TimeSpan(Convert.ToInt32(zeit1[0]), Convert.ToInt32(zeit1[1]), Convert.ToInt32(zeit1[2])); zeit2Time = new TimeSpan(Convert.ToInt32(zeit2[0]), Convert.ToInt32(zeit2[1]), Convert.ToInt32(zeit2[2])); //Return wenn Zeitangabe keinen Sinn macht if (Convert.ToInt32(zeit1[0]) > 24 || Convert.ToInt32(zeit2[0]) > 24 || Convert.ToInt32(zeit1[1]) > 60 || Convert.ToInt32(zeit2[1]) > 60 || Convert.ToInt32(zeit1[2]) > 60 || Convert.ToInt32(zeit2[2]) > 60 || Convert.ToInt32(zeit1[0]) < 0 || Convert.ToInt32(zeit2[0]) < 0 || Convert.ToInt32(zeit1[1]) < 0 || Convert.ToInt32(zeit2[1]) < 0 || Convert.ToInt32(zeit1[2]) < 0 || Convert.ToInt32(zeit2[2]) < 0) return; //Wenn die die von-Zeit "hinter" der bis-Zeit liegt if (zeit2Time.Ticks < zeit1Time.Ticks) { //Einen Tag abziehen und eine neue Zeitdifferenz ausrechnen dateDiff = dateDiff - new TimeSpan(1, 0, 0, 0); zeitDiff = new TimeSpan(24, 0, 0) - (zeit1Time - zeit2Time); } else { zeitDiff = zeit2Time - zeit1Time; } } catch (Exception ex) { Debug.WriteLine(ex.Message); //Zeitdifferenz ist 0, wenn etwas anderes angegeben wird, als eine Zeit zeitDiff = new TimeSpan(0, 0, 0); } } //Ausgabe dateDiff = dateDiff + zeitDiff; ausgabe += "Tage: " + dateDiff.TotalDays.ToString() + "\n"; ausgabe += "Monate: " + (dateDiff.TotalDays / 30).ToString()+ "\n"; ausgabe += "Jahre: " + (dateDiff.TotalDays / 365).ToString() + "\n"; ausgabe += "Stunden: " + dateDiff.TotalHours.ToString() + "\n"; ausgabe += "Minuten: " + dateDiff.TotalMinutes.ToString() + "\n"; ausgabe += "Sekunden: " + dateDiff.TotalSeconds.ToString() + "\n"; ausgabe += "Millisekunden: " + dateDiff.TotalMilliseconds.ToString(); lbl_differenz.Text = ausgabe; lbl_differenz.Visible = true; } } }

namespace Exercise_50 { using System; internal static class Program { private static void Main() { Console.Write("Erster Tag: "); var firstDay = DateTime.Parse(Console.ReadLine()); Console.Write("Zweiter Tag: "); var secondDay = DateTime.Parse(Console.ReadLine()); Console.WriteLine(secondDay - firstDay); Console.Read(); } } }

namespace Exercise_50 { using System; internal static class Program { private static void Main() { Console.Write("Erster Tag: "); var firstDay = DateTime.Parse(Console.ReadLine()); Console.Write("Zweiter Tag: "); var secondDay = DateTime.Parse(Console.ReadLine()); Console.WriteLine(secondDay - firstDay); Console.Read(); } } }

static void Aufgabe_50() { DateTime startdatum = new DateTime(); DateTime enddatum = new DateTime(); Console.Write("Startdatum(DD/MM/YYYY): "); startdatum = Convert.ToDateTime(Console.ReadLine()); Console.Write("Enddatum:(DD/MM/YYYY) "); enddatum = Convert.ToDateTime(Console.ReadLine()); TimeSpan differenz = new TimeSpan(enddatum.Ticks - startdatum.Ticks); Console.WriteLine("{0} Tag(e)", differenz.TotalDays); Console.WriteLine("{0} Stunden", differenz.TotalHours); Console.WriteLine("{0} Minuten", differenz.TotalMinutes); Console.WriteLine("{0} Sekunden", differenz.TotalSeconds); }