{"id":55000079,"date":"2017-04-01T00:00:00","date_gmt":"2020-03-27T19:25:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=79"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datumsfunktionen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Datumsfunktionen\/","title":{"rendered":"Datumsfunktionen"},"content":{"rendered":"<p><b>Ohne Datumsfunktionen kommt man in keiner Programmiersprache aus. Das ist unter C# nat&uuml;rlich nicht anders. Wer allerdings von Access\/VBA kommt, muss sich ein wenig umstellen: Einzelne Funktionen wie Date() oder Time(), mit denen Sie beispielsweise das aktuelle Datum oder die aktuelle Uhrzeit ermittelt haben, suchen Sie hier vergeblich. Stattdessen nutzen Sie verschiedene Eigenschaften des Objekts DateTime. Der vorliegende Artikel zeigt die wichtigsten Elemente der C#-Programmiersprache zum Thema Datum und erl&auml;utert, wie das Datum hier im Hintergrund behandelt wird.<\/b><\/p>\n<h2>Aktuelles Datum und aktuelle Uhrzeit ausgeben<\/h2>\n<p>Als erstes Beispiel wollen wir das aktuelle Datum und die aktuelle Uhrzeit in zwei Textfeldern eines WPF-Fensters ausgeben. Die Steuerelemente daf&uuml;r definieren wir wie folgt:<\/p>\n<pre>&lt;Grid&gt;\r\n     &lt;Grid.RowDefinitions&gt;\r\n         &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n         &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n     &lt;\/Grid.RowDefinitions&gt;\r\n     &lt;Grid.ColumnDefinitions&gt;\r\n         &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n     &lt;\/Grid.ColumnDefinitions&gt;\r\n     &lt;Label Content=\"Aktuelles Datum (DateTime.Now.ToShortDateString):\"&gt;&lt;\/Label&gt;\r\n     &lt;TextBox x:Name=\"txtAktuellesDatum\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n     &lt;Button x:Name=\"btnAktuellesDatum\" Content=\"Aktualisieren\" Grid.Column=\"2\" Click=\"btnAktuellesDatum_Click\"&gt;&lt;\/Button&gt;\r\n     &lt;Label Content=\"Aktuelle Zeit (DateTime.Now.ToShortTimeString):\" Grid.Row=\"1\"&gt;&lt;\/Label&gt;\r\n     &lt;TextBox x:Name=\"txtAktuelleZeit\" Grid.Row=\"1\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n     &lt;Button x:Name=\"btnAktuelleZeit\" Content=\"Aktualisieren\" Grid.Row=\"1\" Grid.Column=\"2\"         Click=\"btnAktuelleZeit_Click\"&gt;&lt;\/Button&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p>Dies ist das Grundger&uuml;st, weitere Elemente r&uuml;sten wir im Laufe dieses Artikels nach. In diesem Fall haben wir ein Grid aufgebaut, das drei Spalten enth&auml;lt &#8211; eines mit der Bezeichnung, eines mit dem per C# ermittelten Inhalt und eines mit einer Schaltfl&auml;che, um den Inhalt des Textfeldes zu aktualisieren oder andere Funktionen auszuf&uuml;hren.<\/p>\n<p>Das obere Textfeld soll das aktuelle Datum anzeigen, das untere die aktuelle Uhrzeit. Die Beschriftungen verraten bereits die dort verwendeten C#-Funktionen. In der Konstruktormethode <b>MainWindow() <\/b>f&uuml;llen wir die Textfelder gleich beim Anzeigen des Fensters:<\/p>\n<pre>public MainWindow() {\r\n     InitializeComponent();\r\n     txtAktuellesDatum.Text = DateTime.Now.ToShortDateString();\r\n     txtAktuelleZeit.Text = DateTime.Now.ToLongTimeString();\r\n}<\/pre>\n<p>Hier sehen Sie, dass wir das aktuelle Datum mit dem Ausdruck <b>DateTime.Now.ToShortDateString() <\/b>ermitteln. Dabei ist <b>DateTime <\/b>das zentrale Objekt, wenn es sich um Datum- und Zeitangaben dreht. Nach diesem einf&uuml;hrenden Beispiel schauen wir uns an, was die <b>DateTime<\/b>-Klasse alles bietet. Das Ergebnis sieht wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_79_005.png\" alt=\"Ausgabe in Textfeldern\" width=\"424,7115\" height=\"147,9426\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ausgabe in Textfeldern<\/span><\/b><\/p>\n<h2>Die DateTime-Klasse<\/h2>\n<p>W&auml;hrend wir unter VBA einfach Funktionen wie <b>Date() <\/b>oder <b>Time() <\/b>nutzen konnten, um die aktuelle Uhrzeit zu ermitteln, ben&ouml;tigen wir unter C# nat&uuml;rlich die Methoden eines Objekts f&uuml;r diesen Zweck &#8211; beziehungsweise die statischen Methoden einer Klasse. In diesem Fall nutzen wir die Methode <b>Now<\/b> der Klasse <b>DateTime<\/b>, um auf das aktuelle Datum und die aktuelle Uhrzeit zuzugreifen, also <b>DateTime.Now<\/b>. Allerdings reicht dies noch nicht aus, denn wir ben&ouml;tigen noch ein Ausgabeformat. <b>DateTime.Now <\/b>liefert n&auml;mlich eine Struktur des Typs <b>DateTime <\/b>zur&uuml;ck, deren Inhalt so nicht direkt ausgegeben werden kann.<\/p>\n<p>Dazu nutzen wir dann wie im obigen Beispiel etwa die Methoden <b>ToShortDateString() <\/b>oder <b>ToLongTimeString()<\/b>.<\/p>\n<h2>Datentyp f&uuml;r das Datum und Ticks<\/h2>\n<p>Der Datentyp zum Speichern von Datumswerten hei&szlig;t unter C# <b>DateTime<\/b>. Genau genommen handelt es sich um eine Struktur, mit der Sie Zeitangaben vom 1.1.0001 bis zum 31.12.9999 darstellen k&ouml;nnen. Intern wird das Datum als <b>long<\/b>-Wert in der Einheit <b>Tick <\/b>gespeichert. Ein Tick entspricht hundert Nanosekunden &#8211; das sollte f&uuml;r die meisten Anwendungsf&auml;lle ausreichend genau sein. Damit steht die interne Speicherung im Gegensatz zu der etwa unter VBA: Hier wird ein Datum als Flie&szlig;kommazahl gespeichert, wobei der Teil vor dem Komma dem Datum und der Teil nach dem Komma der Uhrzeit entspricht. <\/p>\n<p>Neben den Ticks als <b>long<\/b>-Wert enth&auml;lt <b>DateTime <\/b>auch noch die <b>Kind<\/b>-Eigenschaft, welche speichert, ob es sich um ein lokales Datum, ein UTC-Datum (mehr dazu weiter unten) oder ein unspezifisches Datum handelt.<\/p>\n<p>Die verschiedenen Darstellungen wie etwa langes Datum, kurzes Datum, lange Uhrzeit, kurze Uhrzeit oder auch Kombinationen sind lediglich Umrechnungen der gespeicherten Anzahl Ticks in einen Datumswert und die Ausgabe als String.<\/p>\n<h2>Statische Funktionen der DateTime-Klasse<\/h2>\n<p>Die <b>DateTime<\/b>-Klasse liefert eine Reihe Funktionen rund um Datumsangaben, die Sie kennen sollten:<\/p>\n<p><b>Compare<\/b>: Erwartet zwei <b>DateTime<\/b>-Objekte und gibt folgende Werte zur&uuml;ck: <b>-1<\/b>, wenn das erste Datum kleiner als das zweite Datum ist, <b>0<\/b>, wenn beide Daten genau gleich sind, und <b>1<\/b>, wenn das zweite Datum kleiner als das erste Datum ist.<\/p>\n<p><b>DaysInMonth<\/b>: Erwartet die Angabe von Jahr und Monat als Parameter und liefert die Anzahl der Tage dieses Monats zur&uuml;ck. Beispiel: <b>DaysInMonth(2017, 1) <\/b>liefert <b>31<\/b>.<\/p>\n<p><b>Equals<\/b>: Gibt f&uuml;r die beiden als Parameter &uuml;bergebenen <b>DateTime<\/b>-Objekte an, ob diese gleich sind. Beispiel: <b>DateTime.Equals(new DateTime(2017, 1, 1), new DateTime(2017, 1, 1)).ToString() <\/b>liefert <b>true<\/b>.<\/p>\n<p><b>FromBinary<\/b>: Liest ein Datum von einer bin&auml;ren Repr&auml;sentation eines Datums im <b>long<\/b>-Format wieder in ein Datum ein. Dazu ben&ouml;tigen Sie zun&auml;chst die bin&auml;re Form, welche wir im Vorgriff auf die Methoden von Objekten auf Basis der Klasse <b>DateTime <\/b>mit der Methode <b>ToBinary <\/b>erstellen. Wir erstellen hier ein Datum mit <b>Now <\/b>und speichern seine mit <b>ToBinary()<\/b> erstellte bin&auml;re Repr&auml;sentation in der Variablen <b>lngDat<\/b>. Dann geben wir das Originaldatum, die bin&auml;re Variante und das aus dieser Variante zur&uuml;ckverwandelte <b>DateTime<\/b>-Objekt aus:<\/p>\n<pre>DateTime dat = DateTime.Now;\r\nlong lngDat = dat.ToBinary();\r\nConsole.WriteLine(\"Orig. Datum: {0}\", dat.ToString());\r\nConsole.WriteLine(\"Datum bin&auml;r: {0}\", lngDat.ToString());\r\nConsole.WriteLine(\"FromBinary:  {0}\", DateTime.FromBinary(lngDat).ToString());<\/pre>\n<p><b>FromFileTime<\/b>: Wie <b>FromBinary<\/b>, allerdings wird hier eine mit der Methode <b>ToFileTime <\/b>erstellte Anzahl von Ticks wieder zur&uuml;ck verwandelt.<\/p>\n<p><b>FromFileTimeUTC<\/b>: Wie <b>FromFileTime<\/b>, nur dass die mit der Methode <b>ToFileTimeUTC <\/b>erstellte Anzahl von Ticks f&uuml;r eine UTC-Zeit wieder zur&uuml;ck verwandelt wird.<\/p>\n<p><b>FromOADate<\/b>: Wandelt ein Datum, das unter VBA\/OLE erstellt wurde (also die Repr&auml;sentation durch eine Flie&szlig;kommazahl, deren Vorkommastellen das Datum und deren Dezimalstellen die Uhrzeit markieren), in ein <b>DateTime<\/b>-Objekt um.<\/p>\n<p><b>IsLeapYear<\/b>: Gibt an, ob es sich bei dem als Parameter &uuml;bergebenen Jahr um ein Schaltjahr handelt. Beispiel: <b>DateTime.IsLeap-Year(2016).ToString() <\/b>liefert <b>true<\/b>.<\/p>\n<p><b>MaxValue<\/b>: Liefert den gr&ouml;&szlig;tm&ouml;glichen Wert eines <b>DateTime<\/b>-Objekts. Beispiel: <b>DateTime.MaxValue().ToString() <\/b>liefert <b>31.12.9999 23:59:59<\/b>.<\/p>\n<p><b>MinValue<\/b>: Liefert den kleinstm&ouml;glichen Wert eines <b>DateTime<\/b>-Objekts. Beispiel: <b>DateTime.MinValue().ToString() <\/b>liefert <b>01.01.0001 00:00:00<\/b>.<\/p>\n<p><b>Now<\/b>: Liefert ein <b>DateTime<\/b>-Objekt mit dem aktuellen Datum und der aktuellen Uhrzeit. Das <b>DateTime<\/b>-Objekt offeriert weitere Methoden (siehe unten).<\/p>\n<p><b>Parse<\/b>: Erwartet eine Zeichenkette mit einem Datum, welches dann in ein <b>DateTime<\/b>-Objekt konvertiert wird, zum Beispiel <b>DateTime.Parse(&#8220;1.2.2017 10:11:12&#8221;).ToString()<\/b>.<\/p>\n<p><b>ParseExact<\/b>: Wie Parse, nur dass hier noch das genaue Format vorgegeben werden muss: <b>DateTime.ParseExact(&#8220;01.02.2017 10:11:12&#8221;, &#8220;dd.MM.yyyy hh:mm:ss&#8221;, null).ToString();<\/b><\/p>\n<p><b>ReferenceEquals<\/b>: Vergleicht zwei Instanzen und gibt an, ob diese gleich sind. Beispiel: <b>DateTime.ReferenceEquals(new DateTime(2017,1,1), new DateTime(2017,1,1)).ToString() <\/b>liefert <b>false<\/b>, da es sich ja um zwei unabh&auml;ngig erstellte Instanzen handelt.<\/p>\n<p><b>SpecifyKind<\/b>: Art des <b>DateTime<\/b>-Objekts festlegen. Der erste Parameter nimmt das <b>DateTime<\/b>-Objekt entgegen, wobei es sich um ein bestehendes oder auch um ein neu erstelltes <b>DateTime<\/b>-Objekt handeln kann. Der zweite Parameter erwartet ein Element der Enumeration <b>DateTimeKind<\/b>, also etwa <b>UTC<\/b>, <b>Local <\/b>oder <b>Unspecified<\/b>. <\/p>\n<p><b>Today<\/b>: Liefert ein <b>DateTime<\/b>-Objekt mit dem aktuellen Datum. Beispiel: <b>DateTime.Today.ToString() <\/b><\/p>\n<p><b>TryParse<\/b>: Erwartet eine Zeichenkette mit einem Datum, welches in ein <b>DateTime<\/b>-Objekt konvertiert wird, das mit dem zweiten Parameter zur&uuml;ckgegeben wird. Die Funktion liefert den Wert <b>true <\/b>zur&uuml;ck, wenn die Zeichenkette geparst werden konnte, sonst <b>false<\/b>.<\/p>\n<p><b>TryParseExact<\/b>: Wie <b>TryParse<\/b>\/<b>ParseExact<\/b>.<\/p>\n<p><b>UTCNow<\/b>: Liefert ein <b>DateTime<\/b>-Objekt, welches das aktuelle Datum und die Uhrzeit f&uuml;r die koordinierte Weltzeit enth&auml;lt, also f&uuml;r die Zeitzone, in der sich Greenwich\/London befindet. <\/p>\n<h2>Zur koordinierten Weltzeit<\/h2>\n<p>Die von der Funktion <b>UTCNow <\/b>gelieferte koordinierte Weltzeit liefert die aktuelle Uhrzeit plus Datum aus Greenwich (fr&uuml;her GMT\/Greenwich Mean Time, jetzt UCT\/Universal Coordinated Time). Wozu ben&ouml;tigt man diese Zeit, die sich zum Beispiel w&auml;hrend der Sommerzeit um zwei Stunden von der Zeit in Deutschland unterscheidet Wenn Sie eine Datenbank nutzen, die von Benutzern in verschiedenen Zeitzonen verwendet wird, dann sollten Sie Datumsangaben in der Datenbank in dieser Zeit speichern.<\/p>\n<p>Alternativ m&uuml;ssen Sie die Zeitzone in einem separaten Feld speichern, damit Sie sp&auml;ter beispielsweise nachvollziehen k&ouml;nnen, in welcher Reihenfolge Bestellungen eingegangen sind. Sonst w&uuml;rde eine Bestellung, die um 12:00 Uhr lokaler Zeit in Deutschland eingegangen ist, gegen&uuml;ber einer Bestellung, die um 9:00 Uhr lokaler Zeit an der amerikanischen Ostk&uuml;ste eingegangen ist, in der falschen Reihenfolge gespeichert werden &#8211; vorausgesetzt, die Zeitzone wurde nicht mitgespeichert. Wenn Sie die Zeiten in UTC-Zeit umwandeln, w&uuml;rde 12:00 Uhr deutscher Zeit 10:00 Uhr UTC entsprechen und 9:00 Uhr lokaler Zeit an der amerikanischen Ostk&uuml;ste w&auml;re 13:00 Uhr UTC.<\/p>\n<h2>DateTime-Objekte per Konstruktor erstellen<\/h2>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000\"><a style=\"color: #ff0000\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000079\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000079?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000079\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"33f7c20182\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ohne Datumsfunktionen kommt man in keiner Programmiersprache aus. Das ist unter C# nat&uuml;rlich nicht anders. Wer allerdings von Access\/VBA kommt, muss sich ein wenig umstellen: Einzelne Funktionen wie Date() oder Time(), mit denen Sie beispielsweise das aktuelle Datum oder die aktuelle Uhrzeit ermittelt haben, suchen Sie hier vergeblich. Stattdessen nutzen Sie verschiedene Eigenschaften des Objekts DateTime. Der vorliegende Artikel zeigt die wichtigsten Elemente der C#-Programmiersprache zum Thema Datum und erl&auml;utert, wie das Datum hier im Hintergrund behandelt wird.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022017,662017,44000001,44000027,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000079","post","type-post","status-publish","format-standard","hentry","category-66022017","category-662017","category-CGrundlagen","category-Excel_programmieren","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000079"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000079\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000079"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}