Formatieren von Datum und Uhrzeit für eine bestimmte Kultur
Die DateTime-Struktur stellt Methoden bereit, die Anwendungen die Durchführung kulturabhängiger Operationen für einen DateTime-Typ ermöglichen. Eine Anwendung kann die DateTimeFormatInfo-Klasse verwenden, um einen DateTime-Typ basierend auf der Kultur zu formatieren und anzuzeigen. Beispielsweise kann mit DateTimeFormatInfo.ShortDatePattern das Datum 1. Februar 2001 für die Kultur "en-US" (Englisch (USA)) als 2/1/2001 und für die Kultur "en-GB" (Englisch (Großbritannien)) als 01/02/2001 formatiert werden.
Ein DateTimeFormatInfo-Objekt kann nicht für eine neutrale Kultur, sondern nur für eine bestimmte Kultur bzw. die invariante Kultur erstellt werden. Eine neutrale Kultur stellt nicht genügend Informationen zur Verfügung, um das richtige Datumsformat anzuzeigen. Wenn die Anwendung versucht, mit einer neutralen Kultur ein DateTimeFormatInfo-Objekt zu erstellen, wird eine Ausnahme ausgelöst. Weitere Informationen und Beispiele zur Verwendung der DateTime-Formatierung finden Sie unter Formatzeichenfolgen für Datum und Uhrzeit.
Im folgenden Codebeispiel wird das aktuelle Datum mit DateTimeFormatInfo.ShortDatePattern angezeigt, wenn Thread.CurrentThread auf "en-US" für Englisch (USA) und dann auf "de-DE" für Deutsch (Deutschland) festgelegt wird.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class FormatDate
Public Shared Sub Main()
Dim dt As DateTime = DateTime.Now
' Sets the CurrentCulture property to U.S. English.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
' Displays dt, formatted using the ShortDatePattern
' and the CurrentThread.CurrentCulture.
Console.WriteLine(dt.ToString("d"))
' Creates a CultureInfo for German in Germany.
Dim ci As New CultureInfo("de-DE")
' Displays dt, formatted using the ShortDatePattern
' and the CultureInfo.
Console.WriteLine(dt.ToString("d", ci))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class FormatDate
{
public static void Main()
{
DateTime dt = DateTime.Now;
// Sets the CurrentCulture property to U.S. English.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
// Displays dt, formatted using the ShortDatePattern
// and the CurrentThread.CurrentCulture.
Console.WriteLine(dt.ToString("d"));
// Creates a CultureInfo for German in Germany.
CultureInfo ci = new CultureInfo("de-DE");
// Displays dt, formatted using the ShortDatePattern
// and the CultureInfo.
Console.WriteLine(dt.ToString("d", ci));
}
}
Wenn Sie diesen Code am 9. Juli 2001 ausführen, erscheint folgende Ausgabe:
7/9/2001
09.07.2001
Arbeiten mit Zeitzonen
Die DateTime-Struktur verwendet für Berechnungen und Vergleiche immer die lokale Zeitzone. Dies sollten Sie berücksichtigen, wenn die Anwendung die DateTime.Parse-Methode und die DateTime.ParseExact-Methode verwendet. Diese Methoden stellen Überladungen bereit, die die Konvertierung der Zeichenfolgendarstellung eines Datums und einer Uhrzeit in einen DateTime-Typ ermöglichen. Die Anwendung kann auch einen DateTime-Typ für eine bestimmte Kultur formatieren. Wenn in der Zeichenfolge, die an diese Methoden übergeben wird, keine Zeitzone angegeben ist, rufen sie das analysierte Datum und die analysierte Uhrzeit ohne eine Zeitzonenanpassung ab. Das Datum und die Uhrzeit basieren auf der Zeitzoneneinstellung des Betriebssystems. Wenn die Anwendung einen Offsetwert für die Zeitzone angibt, analysieren diese Methoden die Datum/Uhrzeit-Zeichenfolge und konvertieren sie zunächst in die koordinierte Weltzeit (Coordinated Universal Time, UTC; früher bekannt als Greenwich Mean Time, GMT) und anschließend in die Zeit des lokalen Systems.
Die Anwendung sollte die DateTime.ToUniversalTime-Methode verwenden, um einen lokalen DateTime-Typ in das entsprechende UTC-Äquivalent zu konvertieren. Um eine Datum/Uhrzeit-Zeichenfolge zu analysieren und dann in einen UTC-DateTime-Typ zu konvertieren, sollte die Anwendung den DateTimeStyles.AdjustToUniversal-Enumerationswert mit der DateTime.Parse-Method oder mit der DateTime.ParseExact-Methode verwenden.
Im folgenden Codebeispiel wird ein DateTime-Typ für die lokale Zeit erstellt und dann in das entsprechende UTC-Äquivalent konvertiert. Beide Typen werden dann in Zeichenfolgen umgewandelt und auf der Konsole ausgegeben. Beachten Sie, dass sich die Zeichenfolgen um den UTC-Offset zwischen der lokalen Zeitzone und der koordinierten Weltzeit unterscheiden. Diese Zeichenfolgen werden mithilfe der DateTime.ParseExact-Methode zurück in DateTime-Typen konvertiert. Zum Erfassen der in utcdt gespeicherten Zeitzoneninformationen muss der DateTimeStyles.AdjustToUniversal-Wert als Parameter für die DateTime.ParseExact-Methode angegeben werden. Weitere Informationen über den UTC-Offset für verschiedene Zeitzonen finden Sie unter GetUtcOffset.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class TimeZoneSample
Public Shared Sub Main()
Dim en As New CultureInfo("en-US")
Thread.CurrentThread.CurrentCulture = en
' Creates a DateTime for the local time.
Dim dt As New DateTime(2001, 7, 13, 4, 0, 0)
' Converts the local DateTime to the UTC time.
Dim utcdt As DateTime = dt.ToUniversalTime()
' Defines a custom string format to display the DateTime.
' zzz specifies the full time zone offset.
Dim format As [String] = "MM/dd/yyyy hh:mm:sszzz"
' Converts the local time to a string
' using the custom format string and display.
Dim str As [String] = dt.ToString(format)
Console.WriteLine(str)
' Converts the UTC time to a string
' using the custom format string and display.
Dim utcstr As [String] = utcdt.ToString(format)
Console.WriteLine(utcstr)
' Converts the string back to a local DateTime and displays it.
Dim parsedBack As DateTime = DateTime.ParseExact(str, format,
en.DateTimeFormat)
Console.WriteLine(parsedBack)
' Converts the string back to a UTC DateTime and displays it.
' If you do not use the DateTime.ParseExact method that takes
' a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
' will not include the time zone information.
Dim parsedBackUTC As DateTime = DateTime.ParseExact(str, format, _
en.DateTimeFormat, DateTimeStyles.AdjustToUniversal)
Console.WriteLine(parsedBackUTC)
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TimeZoneSample
{
public static void Main()
{
CultureInfo en = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = en;
// Creates a DateTime for the local time.
DateTime dt = new DateTime(2001, 7, 13, 4, 0, 0);
// Converts the local DateTime to the UTC time.
DateTime utcdt = dt.ToUniversalTime();
// Defines a custom string format to display the DateTime value.
// zzzz specifies the full time zone offset.
String format = "MM/dd/yyyy hh:mm:sszzz";
// Converts the local DateTime to a string
// using the custom format string and display.
String str = dt.ToString(format);
Console.WriteLine(str);
// Converts the UTC DateTime to a string
// using the custom format string and display.
String utcstr = utcdt.ToString(format);
Console.WriteLine(utcstr);
// Converts the string back to a local DateTime and displays it.
DateTime parsedBack =
DateTime.ParseExact(str,format,en.DateTimeFormat);
Console.WriteLine(parsedBack);
// Converts the string back to a UTC DateTime and displays it.
// If you do not use the DateTime.ParseExact method that takes
// a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
// object will not include the time zone information.
DateTime parsedBackUTC = DateTime.ParseExact(str,format, _
en.DateTimeFormat, DateTimeStyles.AdjustToUniversal);
Console.WriteLine(parsedBackUTC);
}
}
Dieser Code erzeugt die folgende Ausgabe:
07/13/2001 04:00:00-07:00
07/13/2001 11:00:00-07:00
7/13/2001 4:00:00 AM
7/13/2001 11:00:00 AM
Arbeiten mit DateTime-Membern
Wenn Sie die DateTime-Struktur verwenden, müssen Sie beachten, dass die Member, wie z. B. DateTime.Day, auf dem gregorianischen Kalender basieren. Auch wenn die Anwendung den aktuellen Kalender ändert oder dem Benutzer ermöglicht, die Datums- und Uhrzeiteinstellungen über die Regions- und Sprachoptionen in der Systemsteuerung zu ändern, wird zur Durchführung der Berechnungen für DateTime-Methoden weiterhin der gregorianische Kalender verwendet. Dadurch wird verhindert, dass die von diesen Methoden durchgeführten arithmetischen Operationen durch die Benutzereinstellungen verfälscht werden. Wenn die Anwendung kulturabhängige Datums- und Uhrzeitoperationen auf Basis des aktuellen Kalenders durchführen soll, muss sie die DateTimeFormatInfo.Calendar-Eigenschaft verwenden, um Methoden aufzurufen, die von der Calendar-Klasse bereitgestellt werden, z. B. Calendar.GetDayOfMonth. Ein Beispiel für die verschiedenen Werte, die von den DateTime-Membern und den DateTimeFormatInfo.Calendar-Membern abgerufen werden, finden Sie unter Verwenden von Kalendern für bestimmte Kulturen.
Beachten Sie bei der Arbeit mit der DateTime-Struktur, dass ein DateTime-Typ ein unveränderlicher Wert ist. Daher rufen Methoden wie DateTime.AddDays einen neuen DateTime-Wert ab, anstatt einen vorhandenen Wert zu erhöhen. Das folgende Beispiel zeigt, wie ein DateTime-Typ mithilfe der Anweisung dt = dt.AddDays(1) um einen Tag erhöht wird.
Imports System
Imports System.Globalization
Imports System.Threading
Imports Microsoft.VisualBasic
Public Class TestClass
Public Shared Sub Main()
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Dim dt As DateTime = DateTime.Now
Console.WriteLine(ControlChars.Newline + " Today is {0}", _
DateTime.Now.ToString("d"))
' Increments dt by one day.
dt = dt.AddDays(1)
Console.WriteLine(ControlChars.Newline + " Tomorrow is {0}", _
dt.ToString("d"))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TestClass
{
public static void Main()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
DateTime dt = DateTime.Now;
Console.WriteLine("Today is {0}", DateTime.Now.ToString("d"));
// Increments dt by one day.
dt = dt.AddDays(1);
Console.WriteLine("Tomorrow is {0}", dt.ToString("d"));
}
}
Wenn Sie diesen Code am 3. August 2001 ausführen, wird Folgendes ausgegeben:
Today is 8/3/2001
Tomorrow is 8/4/2001