C# :: Aufgabe #50 :: Lösung #5

8 Lösungen Lösungen öffentlich
#50

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
#5
vote_ok
von Robi (390 Punkte) - 27.11.2015 um 10:37 Uhr
Eine Windows Forms-Lösung mit DateTimePickern und TextBoxen für die Uhrzeit: Anzeige in Tagen, Monaten, Jahren, Stunden, Minuten, Sekunden und Millisekunden :)

Quellcode ausblenden 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;
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben