Formátování data a času pro konkrétní jazykovou verzi
Struktura DateTime poskytuje metody, které umožňují aplikaci provádět operace zohledňující jazykovou verzi nad typem DateTime. Aplikace může používat třídu DateTimeFormatInfo pro formátování a zobrazení typu DateTime v závislosti na jazykové verzi. Například pomocí DateTimeFormatInfo.ShortDatePattern, lze datum 1. února 2001 formátovat jako 2/1/2001 pro jazykovou verzi Angličtina (Spojené státy) "en-US" a jako 01/02/2001 pro jazykovou verzi Angličtinu (Spojené království) "en-GB".
Objekt DateTimeFormatInfo může být vytvořen pro konkrétní jazykovou verzi nebo pro invariantní jazykovou verzi, ale ne pro neutrální jazykovou verzi. Neutrální jazyková verze neposkytuje dostatek informací pro zobrazení správného formátu data. Pokud se aplikace pokusí vytvořit objekt DateTimeFormatInfo s použitím neutrální jazykové verze, je vyvolána výjimka. Další informace a příklady použití formátování typu DateTime naleznete v tématu Formátovací řetězce pro datum a čas.
Následující příklad kódu zobrazí aktuální datum pomocí DateTimeFormatInfo.ShortDatePattern, když je aktuální jazyková verze Thread.CurrentThread nastavena na Angličtina (Spojené státy) "en-US" a následně Němčina (Německo) "de-DE".
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));
}
}
Pokud je tento kód spuštěn dne 9. července 2001, zobrazí se následující výstup:
7/9/2001
09.07.2001
Práce s časovými pásmy
Struktura DateTime vždy používá pro výpočty a porovnání místní časové pásmo. Toto by mělo být bráno v úvahu pokud aplikace používá metody DateTime.Parse a DateTime.ParseExact. Tyto metody poskytují přetížení, která umožňují převod vyjádření data a času pomocí řetězce na typ DateTime. Aplikace může také formátovat typ DateTime pro konkrétní jazykovou verzi. Pokud není v předaném řetězci zadáno časové pásmo, pak tyto metody vrátí analyzovanou hodnotu data a času bez provedení úpravy časového pásma. Datum a čas jsou založeny na nastavení časového pásma operačního systému. Pokud aplikace určí posun časového pásma, pak tyto metody zanalyzují řetězec data a času, převedou je na koordinovaný světový čas (UTC, dříve známý jako střední čas nebo GMT) a nakonec je převedou na čas v místním systému.
Aplikace by měla používat metodu DateTime.ToUniversalTime pro převedení místního typu DateTime na odpovídající čas UTC. Pro analýzu řetězce data a času a převedení na UTC typ DateTime by aplikace měla používat vyčíslení DateTimeStyles.AdjustToUniversal s metodou DateTime.Parse nebo DateTime.ParseExact.
Následující příklad kódu vytvoří typ DateTime pro místní čas a pak jej převede na odpovídající čas UTC. Oba typy jsou převedeny na řetězce a vypsány do konzoly. Všimněte si, že řetězce se liší časovým posunem UTC mezi místním časovým pásmem a časem UTC. Tyto řetězce jsou převedeny zpět na typy DateTime použitím metody DateTime.ParseExact. K zachycení informace o časovém pásmu uloženém v utcdt musí být zadána hodnota AdjustToUniversal z výčtu DateTimeStyles.AdjustToUniversal jako parametr metody DateTime.ParseExact. Další informace o časovém posunu vzhledem k času UTC pro různá časová pásma naleznete v tématu 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);
}
}
Tento kód vytvoří následující výstup:
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
Práce s členy DateTime
Při použití struktury DateTime je třeba si uvědomit, že členové jako například DateTime.Day jsou založeny na gregoriánském kalendáři. I v případě, že aplikace změní aktuální kalendář nebo umožňuje uživateli změnit nastavení data a času prostřednictvím místních a jazykových nastavení v Ovládacích panelech, je stále k provedení výpočtů metodami DateTime používán gregoriánský kalendář, což zabraňuje, aby byly uživatelským nastavením narušeny aritmetické operace prováděné těmito metodami. Pokud má aplikace provádět operace s datem a časem, které zohledňují jazykovou verzi, v závislosti na aktuálním kalendáři, musí používat vlastnost DateTimeFormatInfo.Calendar k volání metod poskytovaných třídou Calendar, jako je například Calendar.GetDayOfMonth. Příklad rozdílu hodnot získaných pomocí členů DateTime a členů DateTimeFormatInfo.Calendar naleznete v tématu Použití kalendáře pro konkrétní jazykovou verzi.
Při práci se strukturou DateTime je potřeba si uvědomit, že typ DateTime je neměnný. Proto metody, jako jsou například DateTime.AddDays vrací novou instanci DateTime namísto přičítání k existující instanci. Následující příklad ukazuje, jak přičíst k typu DateTime jeden den pomocí výrazu dt = dt.AddDays(1).
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"));
}
}
Pokud je tento kód spuštěn dne 3. srpna 2001, zobrazí se následující výstup:
Today is 8/3/2001
Tomorrow is 8/4/2001