Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ini menjadi semakin penting bagi aplikasi apa pun yang bekerja dengan tanggal dan waktu untuk menangani perbedaan antara zona waktu. Aplikasi tidak dapat lagi mengasumsikan bahwa setiap saat dapat diekspresikan di waktu setempat, yang merupakan waktu yang tersedia dari DateTime struktur. Misalnya, halaman web yang menampilkan waktu saat ini di bagian timur Amerika Serikat akan tidak memiliki kredibilitas bagi pelanggan di Asia timur. Artikel ini menjelaskan cara mengubah waktu dari satu zona ke zona lain dan mengonversi DateTimeOffset nilai yang memiliki pengaturan zona waktu terbatas.
Mengonversi ke Waktu Universal Terkoordinasi
Waktu Universal Terkoordinasi (UTC) adalah standar waktu atom yang presisi tinggi. Zona waktu dunia dinyatakan sebagai offset positif atau negatif dari UTC. Dengan demikian, UTC menyediakan waktu bebas zona waktu atau waktu netral zona waktu. Penggunaan UTC direkomendasikan ketika portabilitas tanggal dan waktu di seluruh komputer penting. Untuk detail dan praktik terbaik lainnya menggunakan tanggal dan waktu, lihat Praktik terbaik pengodean menggunakan DateTime di .NET Framework. Mengonversi zona waktu individual ke UTC memudahkan perbandingan waktu.
Nota
Anda juga dapat menserialisasikan DateTimeOffset struktur untuk mewakili satu titik waktu secara tidak ambigu. Karena DateTimeOffset objek menyimpan nilai tanggal dan waktu bersama dengan offsetnya dari UTC, objek selalu mewakili titik waktu tertentu dalam kaitannya dengan UTC.
Cara termudah untuk mengonversi waktu ke UTC adalah dengan memanggil metode static
(Shared
dalam Visual Basic) TimeZoneInfo.ConvertTimeToUtc(DateTime). Konversi yang tepat yang dilakukan oleh metode tergantung pada nilai dateTime
properti parameter Kind , seperti yang ditunjukkan oleh tabel berikut:
DateTime.Kind |
Konversi |
---|---|
DateTimeKind.Local |
Mengonversi waktu lokal ke UTC. |
DateTimeKind.Unspecified |
Asumsikan dateTime parameter adalah waktu lokal dan mengonversi waktu lokal ke UTC. |
DateTimeKind.Utc |
Mengembalikan parameter dateTime tanpa perubahan. |
Kode berikut mengonversi waktu lokal saat ini ke UTC dan menampilkan hasilnya ke konsol:
DateTime dateNow = DateTime.Now;
Console.WriteLine($"The date and time are {TimeZoneInfo.ConvertTimeToUtc(dateNow)} UTC.");
Dim dateNow As Date = Date.Now
Console.WriteLine("The date and time are {0} UTC.", _
TimeZoneInfo.ConvertTimeToUtc(dateNow))
Jika nilai tanggal dan waktu tidak mewakili waktu lokal atau UTC, ToUniversalTime metode kemungkinan akan mengembalikan hasil yang salah. Namun, Anda dapat menggunakan TimeZoneInfo.ConvertTimeToUtc metode untuk mengonversi tanggal dan waktu dari zona waktu tertentu. Untuk detail tentang mengambil TimeZoneInfo objek yang mewakili zona waktu tujuan, lihat Menemukan zona waktu yang ditentukan pada sistem lokal. Kode berikut menggunakan TimeZoneInfo.ConvertTimeToUtc metode untuk mengonversi Waktu Standar Timur ke UTC:
DateTime easternTime = new DateTime(2007, 01, 02, 12, 16, 00);
string easternZoneId = "Eastern Standard Time";
try
{
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById(easternZoneId);
Console.WriteLine($"The date and time are {TimeZoneInfo.ConvertTimeToUtc(easternTime, easternZone)} UTC.");
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine($"Unable to find the {easternZoneId} zone in the registry.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine($"Registry data on the {easternZoneId} zone has been corrupted.");
}
Dim easternTime As New Date(2007, 01, 02, 12, 16, 00)
Dim easternZoneId As String = "Eastern Standard Time"
Try
Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(easternZoneId)
Console.WriteLine("The date and time are {0} UTC.", _
TimeZoneInfo.ConvertTimeToUtc(easternTime, easternZone))
Catch e As TimeZoneNotFoundException
Console.WriteLine("Unable to find the {0} zone in the registry.", _
easternZoneId)
Catch e As InvalidTimeZoneException
Console.WriteLine("Registry data on the {0} zone has been corrupted.", _
easternZoneId)
End Try
Metode TimeZoneInfo.ConvertTimeToUtc melemparkan ArgumentException jika properti Kind dari objek DateTime dan zona waktu tidak cocok. Ketidakcocokan terjadi jika properti Kind adalah DateTimeKind.Local tetapi objek TimeZoneInfo tidak merepresentasikan zona waktu lokal, atau jika properti Kind adalah DateTimeKind.Utc tetapi objek TimeZoneInfo tidak sama dengan TimeZoneInfo.Utc.
Semua metode ini mengambil DateTime nilai sebagai parameter dan mengembalikan DateTime nilai. Untuk nilai DateTimeOffset, struktur DateTimeOffset memiliki metode instans ToUniversalTime yang mengonversi tanggal dan waktu instans saat ini ke UTC. Contoh berikut memanggil metode ToUniversalTime untuk mengonversi waktu lokal dan beberapa waktu lainnya ke UTC.
DateTimeOffset localTime, otherTime, universalTime;
// Define local time in local time zone
localTime = new DateTimeOffset(new DateTime(2007, 6, 15, 12, 0, 0));
Console.WriteLine($"Local time: {localTime}");
Console.WriteLine();
// Convert local time to offset 0 and assign to otherTime
otherTime = localTime.ToOffset(TimeSpan.Zero);
Console.WriteLine($"Other time: {otherTime}");
Console.WriteLine($"{localTime} = {otherTime}: {localTime.Equals(otherTime)}");
Console.WriteLine($"{localTime} exactly equals {otherTime}: {localTime.EqualsExact(otherTime)}");
Console.WriteLine();
// Convert other time to UTC
universalTime = localTime.ToUniversalTime();
Console.WriteLine($"Universal time: {universalTime}");
Console.WriteLine($"{otherTime} = {universalTime}: {universalTime.Equals(otherTime)}");
Console.WriteLine($"{otherTime} exactly equals {universalTime}: {universalTime.EqualsExact(otherTime)}");
Console.WriteLine();
// The example produces the following output to the console:
// Local time: 6/15/2007 12:00:00 PM -07:00
//
// Other time: 6/15/2007 7:00:00 PM +00:00
// 6/15/2007 12:00:00 PM -07:00 = 6/15/2007 7:00:00 PM +00:00: True
// 6/15/2007 12:00:00 PM -07:00 exactly equals 6/15/2007 7:00:00 PM +00:00: False
//
// Universal time: 6/15/2007 7:00:00 PM +00:00
// 6/15/2007 7:00:00 PM +00:00 = 6/15/2007 7:00:00 PM +00:00: True
// 6/15/2007 7:00:00 PM +00:00 exactly equals 6/15/2007 7:00:00 PM +00:00: True
Dim localTime, otherTime, universalTime As DateTimeOffset
' Define local time in local time zone
localTime = New DateTimeOffset(#6/15/2007 12:00:00PM#)
Console.WriteLine("Local time: {0}", localTime)
Console.WriteLine()
' Convert local time to offset 0 and assign to otherTime
otherTime = localTime.ToOffset(TimeSpan.Zero)
Console.WriteLine("Other time: {0}", otherTime)
Console.WriteLine("{0} = {1}: {2}", _
localTime, otherTime, _
localTime.Equals(otherTime))
Console.WriteLine("{0} exactly equals {1}: {2}", _
localTime, otherTime, _
localTime.EqualsExact(otherTime))
Console.WriteLine()
' Convert other time to UTC
universalTime = localTime.ToUniversalTime()
Console.WriteLine("Universal time: {0}", universalTime)
Console.WriteLine("{0} = {1}: {2}", _
otherTime, universalTime, _
universalTime.Equals(otherTime))
Console.WriteLine("{0} exactly equals {1}: {2}", _
otherTime, universalTime, _
universalTime.EqualsExact(otherTime))
Console.WriteLine()
' The example produces the following output to the console:
' Local time: 6/15/2007 12:00:00 PM -07:00
'
' Other time: 6/15/2007 7:00:00 PM +00:00
' 6/15/2007 12:00:00 PM -07:00 = 6/15/2007 7:00:00 PM +00:00: True
' 6/15/2007 12:00:00 PM -07:00 exactly equals 6/15/2007 7:00:00 PM +00:00: False
'
' Universal time: 6/15/2007 7:00:00 PM +00:00
' 6/15/2007 7:00:00 PM +00:00 = 6/15/2007 7:00:00 PM +00:00: True
' 6/15/2007 7:00:00 PM +00:00 exactly equals 6/15/2007 7:00:00 PM +00:00: True
Mengonversi UTC ke zona waktu yang ditunjuk
Untuk mengonversi UTC ke waktu lokal, lihat bagian Mengonversi UTC ke waktu lokal berikut ini. Untuk mengonversi UTC ke waktu di zona waktu apa pun yang Anda tentukan, panggil ConvertTimeFromUtc metode . Metode ini mengambil dua parameter:
UTC yang akan dikonversi. Ini harus menjadi nilai DateTime yang properti Kind-nya diatur ke
Unspecified
atauUtc
.Zona waktu untuk mengonversi UTC ke.
Kode berikut mengonversi UTC ke Waktu Standar Pusat:
DateTime timeUtc = DateTime.UtcNow;
try
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
Console.WriteLine("The date and time are {0} {1}.",
cstTime,
cstZone.IsDaylightSavingTime(cstTime) ?
cstZone.DaylightName : cstZone.StandardName);
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine("The registry does not define the Central Standard Time zone.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine("Registry data on the Central Standard Time zone has been corrupted.");
}
Dim timeUtc As Date = Date.UtcNow
Try
Dim cstZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
Dim cstTime As Date = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone)
Console.WriteLine("The date and time are {0} {1}.", _
cstTime, _
IIf(cstZone.IsDaylightSavingTime(cstTime), _
cstZone.DaylightName, cstZone.StandardName))
Catch e As TimeZoneNotFoundException
Console.WriteLine("The registry does not define the Central Standard Time zone.")
Catch e As InvalidTimeZoneException
Console.WriteLine("Registry data on the Central Standard Time zone has been corrupted.")
End Try
Mengonversi UTC ke waktu lokal
Untuk mengonversi UTC ke waktu lokal, panggil ToLocalTime metode DateTime objek yang waktunya ingin Anda konversi. Perilaku metode yang tepat tergantung pada nilai properti objek Kind , seperti yang ditunjukkan tabel berikut:
DateTime.Kind |
Konversi |
---|---|
DateTimeKind.Local |
Mengembalikan nilai DateTime tanpa perubahan. |
DateTimeKind.Unspecified |
Mengasumsikan bahwa DateTime nilainya adalah UTC dan mengonversi UTC ke waktu lokal. |
DateTimeKind.Utc |
Mengonversi nilai ke DateTime waktu lokal. |
Nota
Metode TimeZone.ToLocalTime berperilaku identik dengan metode DateTime.ToLocalTime
. Dibutuhkan satu parameter, yang merupakan nilai tanggal dan waktu, untuk dikonversi.
Anda juga dapat mengonversi waktu di zona waktu yang ditunjuk ke waktu lokal dengan menggunakan static
metode (Shared
dalam Visual Basic TimeZoneInfo.ConvertTime ). Teknik ini dibahas di bagian berikutnya.
Mengonversi antara dua zona waktu
Anda dapat mengonversi antara dua zona waktu dengan menggunakan salah satu dari dua static
metode TimeZoneInfo (Shared
dalam Visual Basic) kelas berikut:
-
Parameter metode ini adalah nilai tanggal dan waktu untuk dikonversi,
TimeZoneInfo
objek yang mewakili zona waktu nilai tanggal dan waktu, danTimeZoneInfo
objek yang mewakili zona waktu untuk mengonversi nilai tanggal dan waktu. -
Parameter dari metode ini adalah nilai tanggal dan waktu untuk dikonversi, pengidentifikasi zona waktu dari nilai tanggal dan waktu, dan pengidentifikasi zona waktu tempat nilai tanggal dan waktu akan dikonversi.
Kedua metode mengharuskan agar properti nilai tanggal dan waktu yang akan dikonversi dan objek atau pengidentifikasi zona waktu yang mewakili zona waktunya saling sesuai satu sama lain. Jika tidak, maka akan menghasilkan kesalahan ArgumentException. Misalnya, jika Kind
properti nilai tanggal dan waktu adalah DateTimeKind.Local
, pengecualian akan dilemparkan jika TimeZoneInfo
objek yang diteruskan sebagai parameter ke metode tidak sama dengan TimeZoneInfo.Local
. Pengecualian juga dilemparkan jika pengidentifikasi yang diteruskan sebagai parameter ke metode tidak sama dengan TimeZoneInfo.Local.Id
.
Contoh berikut menggunakan ConvertTime metode untuk mengonversi dari Waktu Standar Hawaii ke waktu lokal:
DateTime hwTime = new DateTime(2007, 02, 01, 08, 00, 00);
try
{
TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
Console.WriteLine("{0} {1} is {2} local time.",
hwTime,
hwZone.IsDaylightSavingTime(hwTime) ? hwZone.DaylightName : hwZone.StandardName,
TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local));
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine("The registry does not define the Hawaiian Standard Time zone.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine("Registry data on the Hawaiian Standard Time zone has been corrupted.");
}
Dim hwTime As Date = #2/01/2007 8:00:00 AM#
Try
Dim hwZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time")
Console.WriteLine("{0} {1} is {2} local time.", _
hwTime, _
IIf(hwZone.IsDaylightSavingTime(hwTime), hwZone.DaylightName, hwZone.StandardName), _
TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local))
Catch e As TimeZoneNotFoundException
Console.WriteLine("The registry does not define the Hawaiian Standard Time zone.")
Catch e As InvalidTimeZoneException
Console.WriteLine("Registry data on the Hawaiian Standard Time zone has been corrupted.")
End Try
Mengonversi nilai DateTimeOffset
Nilai tanggal dan waktu yang diwakili oleh DateTimeOffset objek tidak sepenuhnya sadar zona waktu karena objek dipisahkan dari zona waktunya pada saat objek dibuat. Namun, dalam banyak kasus, aplikasi hanya perlu mengonversi tanggal dan waktu berdasarkan dua offset yang berbeda dari UTC daripada tepat waktu di zona waktu tertentu. Untuk melakukan konversi ini, Anda dapat memanggil metode instans ToOffset saat ini. Parameter tunggal dari metode ini adalah offset dari nilai tanggal dan waktu baru yang akan metode ini kembalikan.
Misalnya, jika tanggal dan waktu permintaan pengguna untuk halaman web diketahui dan diserialisasikan sebagai string dalam format MM/dd/yyyy hh:mm:ss zzzz, metode berikut ReturnTimeOnServer
mengonversi nilai tanggal dan waktu ini ke tanggal dan waktu di server web:
public DateTimeOffset ReturnTimeOnServer(string clientString)
{
string format = @"M/d/yyyy H:m:s zzz";
TimeSpan serverOffset = TimeZoneInfo.Local.GetUtcOffset(DateTimeOffset.Now);
try
{
DateTimeOffset clientTime = DateTimeOffset.ParseExact(clientString, format, CultureInfo.InvariantCulture);
DateTimeOffset serverTime = clientTime.ToOffset(serverOffset);
return serverTime;
}
catch (FormatException)
{
return DateTimeOffset.MinValue;
}
}
Public Function ReturnTimeOnServer(clientString As String) As DateTimeOffset
Dim format As String = "M/d/yyyy H:m:s zzz"
Dim serverOffset As TimeSpan = TimeZoneInfo.Local.GetUtcOffset(DateTimeOffset.Now)
Try
Dim clientTime As DateTimeOffset = DateTimeOffset.ParseExact(clientString, format, CultureInfo.InvariantCulture)
Dim serverTime As DateTimeOffset = clientTime.ToOffset(serverOffset)
Return serverTime
Catch e As FormatException
Return DateTimeOffset.MinValue
End Try
End Function
Jika metode melewati string "9/1/2007 5:32:07 -05:00," yang menunjukkan tanggal dan waktu di zona waktu lima jam lebih awal dari UTC, menampilkan "9/1/2007 3:32:07 AM -07:00" untuk server yang terletak di zona Waktu Standar Pasifik AS.
Kelas TimeZoneInfo ini juga menyertakan sebuah overload dari metode TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) yang melakukan konversi zona waktu menggunakan nilai ToOffset(TimeSpan). Parameter metode adalah sebuah DateTimeOffset nilai dan referensi ke zona waktu tempat waktu akan dikonversi. Panggilan metode mengembalikan nilai DateTimeOffset. Misalnya, ReturnTimeOnServer
metode dalam contoh sebelumnya dapat ditulis ulang sebagai berikut untuk memanggil ConvertTime(DateTimeOffset, TimeZoneInfo) metode .
public DateTimeOffset ReturnTimeOnServer(string clientString)
{
string format = @"M/d/yyyy H:m:s zzz";
try
{
DateTimeOffset clientTime = DateTimeOffset.ParseExact(clientString, format,
CultureInfo.InvariantCulture);
DateTimeOffset serverTime = TimeZoneInfo.ConvertTime(clientTime,
TimeZoneInfo.Local);
return serverTime;
}
catch (FormatException)
{
return DateTimeOffset.MinValue;
}
}
Public Function ReturnTimeOnServer(clientString As String) As DateTimeOffset
Dim format As String = "M/d/yyyy H:m:s zzz"
Try
Dim clientTime As DateTimeOffset = DateTimeOffset.ParseExact(clientString, format, CultureInfo.InvariantCulture)
Dim serverTime As DateTimeOffset = TimeZoneInfo.ConvertTime(clientTime, TimeZoneInfo.Local)
Return serverTime
Catch e As FormatException
Return DateTimeOffset.MinValue
End Try
End Function