DateTimeFormatInfo Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan informasi khusus budaya tentang format nilai tanggal dan waktu.
public ref class DateTimeFormatInfo sealed : IFormatProvider
public ref class DateTimeFormatInfo sealed : ICloneable, IFormatProvider
public ref class DateTimeFormatInfo sealed : ICloneable, IFormatProvider, System::Runtime::Serialization::ISerializable
public sealed class DateTimeFormatInfo : IFormatProvider
public sealed class DateTimeFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
public sealed class DateTimeFormatInfo : ICloneable, IFormatProvider, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class DateTimeFormatInfo : ICloneable, IFormatProvider
type DateTimeFormatInfo = class
interface IFormatProvider
type DateTimeFormatInfo = class
interface ICloneable
interface IFormatProvider
[<System.Serializable>]
type DateTimeFormatInfo = class
interface ICloneable
interface IFormatProvider
interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type DateTimeFormatInfo = class
interface ICloneable
interface IFormatProvider
Public NotInheritable Class DateTimeFormatInfo
Implements IFormatProvider
Public NotInheritable Class DateTimeFormatInfo
Implements ICloneable, IFormatProvider
Public NotInheritable Class DateTimeFormatInfo
Implements ICloneable, IFormatProvider, ISerializable
- Warisan
-
DateTimeFormatInfo
- Atribut
- Penerapan
Contoh
Contoh berikut menggunakan refleksi untuk mendapatkan properti objek DateTimeFormatInfo untuk budaya Bahasa Inggris (Amerika Serikat). Ini menampilkan nilai properti yang berisi string format kustom dan menggunakan string tersebut untuk menampilkan tanggal yang diformat.
using System;
using System.Globalization;
using System.Reflection;
public class FormatExample1
{
public static void Run()
{
// Get the properties of an en-US DateTimeFormatInfo object.
DateTimeFormatInfo dtfi = CultureInfo.GetCultureInfo("en-US").DateTimeFormat;
Type typ = dtfi.GetType();
PropertyInfo[] props = typ.GetProperties();
DateTime value = new DateTime(2012, 5, 28, 11, 35, 0);
foreach (var prop in props) {
// Is this a format pattern-related property?
if (prop.Name.Contains("Pattern")) {
string fmt = prop.GetValue(dtfi, null).ToString();
Console.WriteLine("{0,-33} {1} \n{2,-37}Example: {3}\n",
prop.Name + ":", fmt, "",
value.ToString(fmt));
}
}
}
}
// The example displays the following output:
// FullDateTimePattern: dddd, MMMM dd, yyyy h:mm:ss tt
// Example: Monday, May 28, 2012 11:35:00 AM
//
// LongDatePattern: dddd, MMMM dd, yyyy
// Example: Monday, May 28, 2012
//
// LongTimePattern: h:mm:ss tt
// Example: 11:35:00 AM
//
// MonthDayPattern: MMMM dd
// Example: May 28
//
// RFC1123Pattern: ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
// Example: Mon, 28 May 2012 11:35:00 GMT
//
// ShortDatePattern: M/d/yyyy
// Example: 5/28/2012
//
// ShortTimePattern: h:mm tt
// Example: 11:35 AM
//
// SortableDateTimePattern: yyyy'-'MM'-'dd'T'HH':'mm':'ss
// Example: 2012-05-28T11:35:00
//
// UniversalSortableDateTimePattern: yyyy'-'MM'-'dd HH':'mm':'ss'Z'
// Example: 2012-05-28 11:35:00Z
//
// YearMonthPattern: MMMM, yyyy
// Example: May, 2012
Imports System.Globalization
Imports System.Reflection
Module Example
Public Sub Main()
' Get the properties of an en-US DateTimeFormatInfo object.
Dim dtfi As DateTimeFormatInfo = CultureInfo.GetCultureInfo("en-US").DateTimeFormat
Dim typ As Type = dtfi.GetType()
Dim props() As PropertyInfo = typ.GetProperties()
Dim value As Date = #05/28/2012 11:35AM#
For Each prop In props
' Is this a format pattern-related property?
If prop.Name.Contains("Pattern") Then
Dim fmt As String = CStr(prop.GetValue(dtfi, Nothing))
Console.WriteLine("{0,-33} {1} {2}{3,-37}Example: {4}",
prop.Name + ":", fmt, vbCrLf, "",
value.ToString(fmt))
Console.WriteLine()
End If
Next
End Sub
End Module
' The example displays the following output:
' FullDateTimePattern: dddd, MMMM dd, yyyy h:mm:ss tt
' Example: Monday, May 28, 2012 11:35:00 AM
'
' LongDatePattern: dddd, MMMM dd, yyyy
' Example: Monday, May 28, 2012
'
' LongTimePattern: h:mm:ss tt
' Example: 11:35:00 AM
'
' MonthDayPattern: MMMM dd
' Example: May 28
'
' RFC1123Pattern: ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
' Example: Mon, 28 May 2012 11:35:00 GMT
'
' ShortDatePattern: M/d/yyyy
' Example: 5/28/2012
'
' ShortTimePattern: h:mm tt
' Example: 11:35 AM
'
' SortableDateTimePattern: yyyy'-'MM'-'dd'T'HH':'mm':'ss
' Example: 2012-05-28T11:35:00
'
' UniversalSortableDateTimePattern: yyyy'-'MM'-'dd HH':'mm':'ss'Z'
' Example: 2012-05-28 11:35:00Z
'
' YearMonthPattern: MMMM, yyyy
' Example: May, 2012
Keterangan
Properti DateTimeFormatInfo kelas berisi informasi khusus budaya untuk memformat atau mengurai nilai tanggal dan waktu seperti berikut ini:
- Pola yang digunakan untuk memformat nilai tanggal.
- Pola yang digunakan untuk memformat nilai waktu.
- Nama-nama hari dalam seminggu.
- Nama-nama bulan dalam setahun.
- Penanda A.M. dan P.M. yang digunakan pada nilai waktu.
- Kalender tempat tanggal dinyatakan.
Menginstansiasi objek DateTimeFormatInfo
Objek DateTimeFormatInfo dapat mewakili konvensi pemformatan budaya invarian, budaya tertentu, budaya netral, atau budaya saat ini. Bagian ini membahas cara membuat instans setiap jenis DateTimeFormatInfo objek.
Membuat instans objek DateTimeFormatInfo untuk budaya invarian
Budaya invarian mewakili budaya yang tidak peka budaya. Ini didasarkan pada bahasa Inggris, tetapi tidak pada negara/wilayah berbahasa Inggris tertentu. Meskipun data budaya tertentu dapat dinamis dan dapat berubah untuk mencerminkan konvensi budaya baru atau preferensi pengguna, data budaya invarian tidak berubah. Anda dapat membuat instance objek DateTimeFormatInfo yang mewakili konvensi pemformatan budaya invarian dengan cara berikut:
- Dengan mengambil nilai properti InvariantInfo. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
- Dengan memanggil konstruktor yang tidak memiliki parameter DateTimeFormatInfo. Objek DateTimeFormatInfo yang dikembalikan dapat dibaca dan ditulis.
- Dengan mengambil nilai properti DateTimeFormat dari objek CultureInfo yang dikembalikan oleh properti CultureInfo.InvariantCulture. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
Contoh berikut menggunakan masing-masing metode ini untuk membuat instans DateTimeFormatInfo objek yang mewakili budaya invarian. Kemudian menunjukkan apakah objek bersifat hanya-baca.
System.Globalization.DateTimeFormatInfo dtfi;
dtfi = System.Globalization.DateTimeFormatInfo.InvariantInfo;
Console.WriteLine(dtfi.IsReadOnly);
dtfi = new System.Globalization.DateTimeFormatInfo();
Console.WriteLine(dtfi.IsReadOnly);
dtfi = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat;
Console.WriteLine(dtfi.IsReadOnly);
// The example displays the following output:
// True
// False
// True
Membuat instans objek DateTimeFormatInfo untuk budaya tertentu
Budaya tertentu mewakili bahasa yang diucapkan di negara/wilayah tertentu. Misalnya, en-US adalah budaya tertentu yang mewakili bahasa Inggris yang digunakan di Amerika Serikat, dan en-CA adalah budaya tertentu yang mewakili bahasa Inggris yang digunakan di Kanada. Anda dapat membuat DateTimeFormatInfo instans objek yang mewakili konvensi pemformatan budaya tertentu dengan cara berikut:
Dengan memanggil metode CultureInfo.GetCultureInfo(String) dan mengambil nilai dari properti CultureInfo objek CultureInfo.DateTimeFormat yang dikembalikan. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
Dengan meneruskan metode statis GetInstance sebuah objek CultureInfo yang mewakili budaya yang objek DateTimeFormatInfo-nya ingin Anda ambil. Objek DateTimeFormatInfo yang dikembalikan dapat dibaca dan ditulis.
Dengan memanggil metode statis CultureInfo.CreateSpecificCulture dan mengambil nilai properti objek CultureInfo yang dikembalikanCultureInfo.DateTimeFormat. Objek DateTimeFormatInfo yang dikembalikan dapat dibaca dan ditulis.
Dengan memanggil konstruktor kelas CultureInfo.CultureInfo dan mengambil nilai dari properti objek CultureInfo yang dikembalikan CultureInfo.DateTimeFormat. Objek DateTimeFormatInfo yang dikembalikan dapat dibaca dan ditulis.
Contoh berikut mengilustrasikan masing-masing cara untuk menginstansiasi objek DateTimeFormatInfo dan menunjukkan apakah objek yang dihasilkan bersifat baca-saja.
System.Globalization.CultureInfo ci = null;
System.Globalization.DateTimeFormatInfo dtfi = null;
// Instantiate a culture using CreateSpecificCulture.
ci = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
dtfi = ci.DateTimeFormat;
Console.WriteLine($"{ci.Name} from CreateSpecificCulture: {dtfi.IsReadOnly}");
// Instantiate a culture using the CultureInfo constructor.
ci = new System.Globalization.CultureInfo("en-CA");
dtfi = ci.DateTimeFormat;
Console.WriteLine($"{ci.Name} from CultureInfo constructor: {dtfi.IsReadOnly}");
// Retrieve a culture by calling the GetCultureInfo method.
ci = System.Globalization.CultureInfo.GetCultureInfo("en-AU");
dtfi = ci.DateTimeFormat;
Console.WriteLine($"{ci.Name} from GetCultureInfo: {dtfi.IsReadOnly}");
// Instantiate a DateTimeFormatInfo object by calling DateTimeFormatInfo.GetInstance.
ci = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
dtfi = System.Globalization.DateTimeFormatInfo.GetInstance(ci);
Console.WriteLine($"{ci.Name} from GetInstance: {dtfi.IsReadOnly}");
// The example displays the following output:
// en-US from CreateSpecificCulture: False
// en-CA from CultureInfo constructor: False
// en-AU from GetCultureInfo: True
// en-GB from GetInstance: False
Membuat instans objek DateTimeFormatInfo untuk budaya netral
Budaya netral mewakili budaya atau bahasa yang independen dari suatu negara/wilayah; biasanya induk dari satu atau beberapa budaya tertentu. Misalnya, Fr adalah budaya netral untuk bahasa Prancis dan induk budaya fr-FR. Anda dapat membuat instans DateTimeFormatInfo objek yang mewakili konvensi pemformatan budaya netral dengan cara yang sama seperti Anda membuat DateTimeFormatInfo objek yang mewakili konvensi pemformatan dari budaya tertentu. Selain itu, Anda dapat mengambil objek budaya DateTimeFormatInfo netral dengan mengambil budaya netral dari properti budaya CultureInfo.Parent tertentu, dan mengambil objek DateTimeFormatInfo yang dikembalikan oleh properti CultureInfo.DateTimeFormat-nya. Kecuali budaya induk mewakili budaya invarian, objek yang dikembalikan DateTimeFormatInfo adalah baca/tulis. Contoh berikut menggambarkan cara menginstansiasi objek DateTimeFormatInfo yang mewakili kebudayaan netral.
System.Globalization.CultureInfo specific, neutral;
System.Globalization.DateTimeFormatInfo dtfi;
// Instantiate a culture by creating a specific culture and using its Parent property.
specific = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
neutral = specific.Parent;
dtfi = neutral.DateTimeFormat;
Console.WriteLine($"{neutral.Name} from Parent property: {dtfi.IsReadOnly}");
dtfi = System.Globalization.CultureInfo.GetCultureInfo("fr-FR").Parent.DateTimeFormat;
Console.WriteLine($"{neutral.Name} from Parent property: {dtfi.IsReadOnly}");
// Instantiate a neutral culture using the CultureInfo constructor.
neutral = new System.Globalization.CultureInfo("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine($"{neutral.Name} from CultureInfo constructor: {dtfi.IsReadOnly}");
// Instantiate a culture using CreateSpecificCulture.
neutral = System.Globalization.CultureInfo.CreateSpecificCulture("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine($"{neutral.Name} from CreateSpecificCulture: {dtfi.IsReadOnly}");
// Retrieve a culture by calling the GetCultureInfo method.
neutral = System.Globalization.CultureInfo.GetCultureInfo("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine($"{neutral.Name} from GetCultureInfo: {dtfi.IsReadOnly}");
// Instantiate a DateTimeFormatInfo object by calling GetInstance.
neutral = System.Globalization.CultureInfo.CreateSpecificCulture("fr");
dtfi = System.Globalization.DateTimeFormatInfo.GetInstance(neutral);
Console.WriteLine($"{neutral.Name} from GetInstance: {dtfi.IsReadOnly}");
// The example displays the following output:
// fr from Parent property: False
// fr from Parent property: False
// fr from CultureInfo constructor: False
// fr-FR from CreateSpecificCulture: False
// fr from GetCultureInfo: True
// fr-FR from GetInstance: False
Namun, budaya netral tidak memiliki informasi pemformatan khusus budaya, karena independen dari negara/wilayah tertentu. Alih-alih mengisi DateTimeFormatInfo objek dengan nilai generik, .NET mengembalikan DateTimeFormatInfo objek yang mencerminkan konvensi pemformatan dari budaya tertentu yang merupakan anak dari budaya netral. Misalnya, DateTimeFormatInfo objek untuk budaya en netral mencerminkan konvensi pemformatan budaya en-US, dan DateTimeFormatInfo objek untuk budaya fr mencerminkan konvensi pemformatan budaya fr-FR.
Anda dapat menggunakan kode seperti berikut untuk menentukan konvensi pemformatan budaya tertentu mana yang diwakili oleh budaya netral. Contohnya menggunakan refleksi untuk membandingkan DateTimeFormatInfo sifat budaya netral dengan sifat budaya anak tertentu. Ini menganggap dua kalender setara jika merupakan jenis kalender yang sama dan, untuk kalender Gregorian, jika propertinya GregorianCalendar.CalendarType memiliki nilai yang identik.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
public class InstantiateEx6
{
public static void Main()
{
// Get all the neutral cultures
List<String> names = new List<String>();
Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
culture => names.Add(culture.Name));
names.Sort();
foreach (var name in names)
{
// Ignore the invariant culture.
if (name == "") continue;
ListSimilarChildCultures(name);
}
}
private static void ListSimilarChildCultures(String name)
{
// Create the neutral DateTimeFormatInfo object.
DateTimeFormatInfo dtfi = CultureInfo.GetCultureInfo(name).DateTimeFormat;
// Retrieve all specific cultures of the neutral culture.
CultureInfo[] cultures = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures),
culture => culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase));
// Create an array of DateTimeFormatInfo properties
PropertyInfo[] properties = typeof(DateTimeFormatInfo).GetProperties(BindingFlags.Instance | BindingFlags.Public);
bool hasOneMatch = false;
foreach (var ci in cultures)
{
bool match = true;
// Get the DateTimeFormatInfo for a specific culture.
DateTimeFormatInfo specificDtfi = ci.DateTimeFormat;
// Compare the property values of the two.
foreach (var prop in properties)
{
// We're not interested in the value of IsReadOnly.
if (prop.Name == "IsReadOnly") continue;
// For arrays, iterate the individual elements to see if they are the same.
if (prop.PropertyType.IsArray)
{
IList nList = (IList)prop.GetValue(dtfi, null);
IList sList = (IList)prop.GetValue(specificDtfi, null);
if (nList.Count != sList.Count)
{
match = false;
Console.WriteLine($" Different n in {prop.Name} array for {name} and {ci.Name}");
break;
}
for (int ctr = 0; ctr < nList.Count; ctr++)
{
if (!nList[ctr].Equals(sList[ctr]))
{
match = false;
Console.WriteLine($" {prop.Name} value different for {name} and {ci.Name}");
break;
}
}
if (!match) break;
}
// Get non-array values.
else
{
Object specificValue = prop.GetValue(specificDtfi);
Object neutralValue = prop.GetValue(dtfi);
// Handle comparison of Calendar objects.
if (prop.Name == "Calendar")
{
// The cultures have a different calendar type.
if (specificValue.ToString() != neutralValue.ToString())
{
Console.WriteLine($" Different calendar types for {name} and {ci.Name}");
match = false;
break;
}
if (specificValue is GregorianCalendar)
{
if (((GregorianCalendar)specificValue).CalendarType != ((GregorianCalendar)neutralValue).CalendarType)
{
Console.WriteLine($" Different Gregorian calendar types for {name} and {ci.Name}");
match = false;
break;
}
}
}
else if (!specificValue.Equals(neutralValue))
{
match = false;
Console.WriteLine($" Different {prop.Name} values for {name} and {ci.Name}");
break;
}
}
}
if (match)
{
Console.WriteLine($"DateTimeFormatInfo object for '{name}' matches '{ci.Name}'");
hasOneMatch = true;
}
}
if (!hasOneMatch)
Console.WriteLine($"DateTimeFormatInfo object for '{name}' --> No Match");
Console.WriteLine();
}
}
Membuat instans objek DateTimeFormatInfo untuk budaya saat ini
Anda dapat membuat objek DateTimeFormatInfo yang mewakili konvensi pemformatan kultur saat ini dengan cara berikut:
Dengan mengambil nilai properti CurrentInfo. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
Dengan mengambil nilai properti DateTimeFormat dari objek CultureInfo yang dikembalikan oleh properti CultureInfo.CurrentCulture. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
Dengan memanggil metode GetInstance dengan objek CultureInfo yang mewakili kebudayaan saat ini. Objek yang dikembalikan DateTimeFormatInfo bersifat hanya-baca.
Contoh berikut menggunakan masing-masing metode ini untuk membuat instans DateTimeFormatInfo objek yang mewakili konvensi pemformatan budaya saat ini. Kemudian menunjukkan apakah objek bersifat hanya-baca.
DateTimeFormatInfo dtfi;
dtfi = DateTimeFormatInfo.CurrentInfo;
Console.WriteLine(dtfi.IsReadOnly);
dtfi = CultureInfo.CurrentCulture.DateTimeFormat;
Console.WriteLine(dtfi.IsReadOnly);
dtfi = DateTimeFormatInfo.GetInstance(CultureInfo.CurrentCulture);
Console.WriteLine(dtfi.IsReadOnly);
// The example displays the following output:
// True
// True
// True
Anda dapat membuat objek bisa-tulis DateTimeFormatInfo yang mewakili konvensi budaya saat ini dengan salah satu cara berikut:
Dengan mengambil objek DateTimeFormatInfo dengan salah satu dari tiga cara sebelumnya, lalu memanggil metode Clone pada objek DateTimeFormatInfo yang dikembalikan. Ini membuat salinan objek asli DateTimeFormatInfo , kecuali bahwa propertinya IsReadOnly adalah
false.Dengan memanggil metode CultureInfo.CreateSpecificCulture untuk menciptakan objek CultureInfo yang mewakili kultur saat ini, dan kemudian menggunakan propertinya CultureInfo.DateTimeFormat untuk mengambil objek DateTimeFormatInfo.
Contoh berikut mengilustrasikan setiap cara membuat instans objek baca/tulis DateTimeFormatInfo dan menampilkan nilai propertinya IsReadOnly .
using System;
using System.Globalization;
public class InstantiateEx1
{
public static void Main()
{
DateTimeFormatInfo current1 = DateTimeFormatInfo.CurrentInfo;
current1 = (DateTimeFormatInfo)current1.Clone();
Console.WriteLine(current1.IsReadOnly);
CultureInfo culture2 = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
DateTimeFormatInfo current2 = culture2.DateTimeFormat;
Console.WriteLine(current2.IsReadOnly);
}
}
// The example displays the following output:
// False
// False
Di Windows, pengguna dapat mengambil alih beberapa nilai properti yang DateTimeFormatInfo digunakan dalam operasi pemformatan dan penguraian melalui aplikasi Wilayah dan Bahasa di Panel Kontrol. Misalnya, pengguna yang budayanya adalah bahasa Inggris (Amerika Serikat) mungkin memilih untuk menampilkan nilai waktu lama menggunakan jam 24 jam (dalam format HH:mm:ss) alih-alih jam 12 jam default (dalam format h:mm:ss tt). Objek DateTimeFormatInfo yang diambil dengan cara yang telah dibahas sebelumnya akan mencerminkan semua penyesuaian pengguna ini. Jika ini tidak diinginkan, Anda dapat membuat objek NumberFormatInfo yang tidak mencerminkan penggantian oleh pengguna (dan juga baca/tulis alih-alih hanya-baca) dengan memanggil konstruktor CultureInfo.CultureInfo(String, Boolean) dan menyediakan nilai false untuk argumen useUserOverride. Contoh berikut menggambarkan ini untuk sistem yang budayanya saat ini adalah Bahasa Inggris (Amerika Serikat) dan pola waktu lamanya telah diubah dari default h:mm:ss tt menjadi HH:mm:ss.
using System;
using System.Globalization;
public class InstantiateEx3
{
public static void Main()
{
CultureInfo culture;
DateTimeFormatInfo dtfi;
culture = CultureInfo.CurrentCulture;
dtfi = culture.DateTimeFormat;
Console.WriteLine($"Culture Name: {culture.Name}");
Console.WriteLine($"User Overrides: {culture.UseUserOverride}");
Console.WriteLine($"Long Time Pattern: {culture.DateTimeFormat.LongTimePattern}\n");
culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
Console.WriteLine($"Culture Name: {culture.Name}");
Console.WriteLine($"User Overrides: {culture.UseUserOverride}");
Console.WriteLine($"Long Time Pattern: {culture.DateTimeFormat.LongTimePattern}\n");
}
}
// The example displays the following output:
// Culture Name: en-US
// User Overrides: True
// Long Time Pattern: HH:mm:ss
//
// Culture Name: en-US
// User Overrides: False
// Long Time Pattern: h:mm:ss tt
DateTimeFormatInfo dan data dinamis
Data khusus budaya untuk memformat nilai tanggal dan waktu yang disediakan oleh DateTimeFormatInfo kelas bersifat dinamis, sama seperti data budaya yang disediakan oleh CultureInfo kelas. Anda tidak boleh membuat asumsi tentang stabilitas nilai untuk DateTimeFormatInfo objek yang terkait dengan objek tertentu CultureInfo . Hanya data yang disediakan oleh budaya invarian dan objek terkait DateTimeFormatInfo yang stabil. Data lain dapat berubah di antara sesi aplikasi atau bahkan saat aplikasi Anda berjalan. Ada empat sumber perubahan utama:
Pembaruan sistem. Preferensi budaya seperti kalender pilihan atau format tanggal dan waktu adat berubah dari waktu ke waktu. Ketika ini terjadi, Windows Update menyertakan perubahan nilai properti pada DateTimeFormatInfo untuk budaya tertentu.
Budaya penggantian. Kelas CultureAndRegionInfoBuilder dapat digunakan untuk menggantikan data budaya yang ada.
Perubahan berantai pada nilai properti. Sejumlah properti terkait budaya dapat berubah pada runtime, yang, pada gilirannya, menyebabkan DateTimeFormatInfo data berubah. Misalnya, budaya saat ini dapat diubah baik secara terprogram atau melalui tindakan pengguna. Ketika ini terjadi, objek DateTimeFormatInfo yang dikembalikan oleh properti CurrentInfo berubah menjadi objek yang terkait dengan kebudayaan saat ini. Demikian pula, kalender budaya dapat berubah, yang dapat mengakibatkan perubahan pada banyak DateTimeFormatInfo nilai properti.
Preferensi pengguna. Pengguna aplikasi Anda mungkin memilih untuk mengambil alih beberapa nilai yang terkait dengan budaya sistem saat ini melalui opsi regional dan bahasa dalam Panel Kontrol. Misalnya, pengguna dapat memilih untuk menampilkan tanggal dalam format yang berbeda. Jika properti CultureInfo.UseUserOverride diatur ke
true, properti dari objek DateTimeFormatInfo juga diambil dari pengaturan pengguna. Jika pengaturan pengguna tidak kompatibel dengan budaya yang terkait dengan CultureInfo objek (misalnya, jika kalender yang dipilih bukan salah satu kalender yang ditunjukkan oleh OptionalCalendars properti), hasil metode dan nilai properti tidak ditentukan.
Untuk meminimalkan kemungkinan data yang tidak konsisten, semua properti objek DateTimeFormatInfo yang dapat diubah oleh pengguna diinisialisasi saat objek tersebut dibuat. Masih ada kemungkinan ketidakkonsistenan, karena baik pembuatan objek maupun proses penggantian pengguna tidak bersifat atomik dan nilai-nilai yang relevan dapat berubah selama pembuatan objek. Namun, situasi ini harus sangat jarang terjadi.
Anda dapat mengontrol apakah penimpaan pengguna tercermin dalam DateTimeFormatInfo objek yang mewakili kultur yang sama dengan kultur sistem. Tabel berikut mencantumkan cara pengambilan objek DateTimeFormatInfo dan mengindikasikan apakah objek yang dihasilkan mencerminkan penimpaan pengguna.
| Sumber objek CultureInfo dan DateTimeFormatInfo | Mencerminkan penimpaan pengguna |
|---|---|
properti CultureInfo.CurrentCulture.DateTimeFormat |
Yes |
| properti DateTimeFormatInfo.CurrentInfo | Yes |
| metode CultureInfo.CreateSpecificCulture | Yes |
| metode CultureInfo.GetCultureInfo | No |
| CultureInfo.CultureInfo(String) pembangun | Yes |
| CultureInfo.CultureInfo(String, Boolean) pembangun | Bergantung pada nilai useUserOverride parameter |
Kecuali ada alasan kuat untuk melakukan sebaliknya, Anda harus menghormati penimpaan pengguna ketika Anda menggunakan DateTimeFormatInfo objek dalam aplikasi klien untuk memformat dan mengurai input pengguna atau menampilkan data. Untuk aplikasi server atau aplikasi tanpa pengawas, sebaiknya Anda tidak. Namun, jika Anda menggunakan DateTimeFormatInfo objek baik secara eksplisit atau implisit untuk mempertahankan data tanggal dan waktu dalam bentuk string, Anda harus menggunakan DateTimeFormatInfo objek yang mencerminkan konvensi pemformatan budaya invarian, atau Anda harus menentukan string format tanggal dan waktu kustom yang Anda gunakan terlepas dari budaya.
Format tanggal dan waktu
Objek DateTimeFormatInfo digunakan secara implisit atau eksplisit dalam semua operasi pemformatan tanggal dan waktu. Ini mencakup panggilan ke metode-metode berikut:
- Semua metode pemformatan tanggal dan waktu, seperti DateTime.ToString() dan DateTimeOffset.ToString(String).
- Metode pemformatan komposit utama, yaitu String.Format.
- Metode pemformatan komposit lainnya, seperti Console.WriteLine(String, Object[]) dan StringBuilder.AppendFormat(String, Object[]).
Semua operasi pemformatan tanggal dan waktu menggunakan IFormatProvider implementasi. Antarmuka IFormatProvider mencakup satu metode, IFormatProvider.GetFormat(Type). Metode panggilan balik ini diteruskan objek Type yang mewakili jenis yang diperlukan untuk memberikan informasi pemformatan. Metode mengembalikan instans dari jenis tersebut atau null jika tidak dapat memberikan instans dari jenis tersebut. .NET mencakup dua IFormatProvider implementasi untuk memformat tanggal dan waktu:
- Kelas CultureInfo , yang mewakili budaya tertentu (atau bahasa tertentu di negara/wilayah tertentu). Dalam operasi pemformatan tanggal dan waktu, metode CultureInfo.GetFormat mengembalikan objek DateTimeFormatInfo yang terkait dengan properti CultureInfo.DateTimeFormat-nya.
- Kelas DateTimeFormatInfo , yang menyediakan informasi tentang konvensi pemformatan dari budaya terkaitnya. Metode DateTimeFormatInfo.GetFormat mengembalikan instance dirinya sendiri.
Jika implementasi dari IFormatProvider tidak secara eksplisit diberikan kepada metode pemformatan, maka objek dari CultureInfo yang dikembalikan oleh properti CultureInfo.CurrentCulture yang mewakili budaya saat ini akan digunakan.
Contoh berikut mengilustrasikan hubungan antara IFormatProvider antarmuka dan DateTimeFormatInfo kelas dalam operasi pemformatan. Ini mendefinisikan implementasi kustom IFormatProvider yang metodenya GetFormat menampilkan jenis objek yang diminta oleh operasi pemformatan. Jika meminta DateTimeFormatInfo objek, metode menyediakan DateTimeFormatInfo objek untuk budaya saat ini. Seperti yang ditunjukkan oleh output dari contoh, metode Decimal.ToString(IFormatProvider) meminta objek DateTimeFormatInfo untuk memberikan informasi pemformatan, sedangkan metode String.Format(IFormatProvider, String, Object[]) meminta objek NumberFormatInfo dan DateTimeFormatInfo serta implementasi ICustomFormatter.
using System;
using System.Globalization;
public class CurrentCultureFormatProvider : IFormatProvider
{
public Object? GetFormat(Type formatType)
{
Console.WriteLine($"Requesting an object of type {formatType.Name}");
if (formatType == typeof(NumberFormatInfo))
return NumberFormatInfo.CurrentInfo;
else if (formatType == typeof(DateTimeFormatInfo))
return DateTimeFormatInfo.CurrentInfo;
else
return null;
}
}
public class FormatProviderEx1
{
public static void Main()
{
DateTime dateValue = new(2013, 5, 28, 13, 30, 0);
string value = dateValue.ToString("F", new CurrentCultureFormatProvider());
Console.WriteLine(value);
Console.WriteLine();
string composite = string.Format(new CurrentCultureFormatProvider(),
"Date: {0:d} Amount: {1:C} Description: {2}",
dateValue, 1264.03m, "Service Charge");
Console.WriteLine(composite);
Console.WriteLine();
}
}
// The example displays output like the following:
// Requesting an object of type DateTimeFormatInfo
// Tuesday, May 28, 2013 1:30:00 PM
//
// Requesting an object of type ICustomFormatter
// Requesting an object of type DateTimeFormatInfo
// Requesting an object of type NumberFormatInfo
// Date: 5/28/2013 Amount: $1,264.03 Description: Service Charge
Format string dan properti DateTimeFormatInfo
Objek DateTimeFormatInfo mencakup tiga jenis properti yang digunakan dalam operasi pemformatan dengan nilai tanggal dan waktu:
Properti terkait kalender. Properti seperti AbbreviatedDayNames, AbbreviatedMonthNames, DayNames, dan MonthNames, dikaitkan dengan kalender yang digunakan oleh kebudayaan, yang ditentukan oleh properti Calendar. Properti ini digunakan untuk format tanggal dan waktu yang lama.
Properti yang menghasilkan string hasil yang ditentukan oleh standar. Properti RFC1123Pattern, SortableDateTimePattern, dan UniversalSortableDateTimePattern berisi string format kustom yang menghasilkan string hasil yang ditentukan oleh standar internasional. Properti ini bersifat baca-saja dan tidak dapat dimodifikasi.
Properti yang mendefinisikan string hasil yang peka terhadap budaya. Beberapa properti, seperti FullDateTimePattern dan ShortDatePattern, berisi string format kustom yang menentukan format string hasil. Lainnya, seperti AMDesignator, , DateSeparatorPMDesignator, dan TimeSeparator, menentukan simbol atau substring sensitif budaya yang dapat disertakan dalam string hasil.
String format tanggal dan waktu standar, seperti "d", "D", "f", dan "F", adalah alias yang sesuai dengan properti pola format tertentuDateTimeFormatInfo. Sebagian besar string format tanggal dan waktu kustom berkaitan dengan string atau substring yang ditambahkan oleh operasi pemformatan ke dalam aliran hasil. Tabel berikut mencantumkan penentu format tanggal dan waktu standar dan kustom serta properti terkaitnya DateTimeFormatInfo . Untuk detail tentang cara menggunakan penentu format ini, lihat String Format Tanggal dan Waktu Standar dan String Format Tanggal dan Waktu Kustom. Perhatikan bahwa setiap string format standar sesuai dengan DateTimeFormatInfo properti yang nilainya adalah string format tanggal dan waktu kustom. Penentu individu dalam string format kustom ini pada gilirannya sesuai dengan properti lain DateTimeFormatInfo . Tabel mencantumkan hanya DateTimeFormatInfo properti-properti yang format standar stringnya bertindak sebagai alias, dan tidak mencantumkan properti-properti yang dapat diakses melalui string format kustom yang ditetapkan pada properti alias tersebut. Selain itu, tabel hanya mencantumkan penentu format kustom yang sesuai dengan DateTimeFormatInfo properti.
| Spesifikator Format | Properti terkait |
|---|---|
| "d" (tanggal pendek; string format standar) | ShortDatePattern, untuk menentukan format keseluruhan string hasil. |
| "D" (tanggal panjang; string format standar) | LongDatePattern, untuk menentukan format keseluruhan string hasil. |
| "f" (tanggal penuh/waktu singkat; string format standar) |
LongDatePattern, untuk menentukan format komponen tanggal string hasil. ShortTimePattern, untuk menentukan format komponen waktu dari string hasil. |
| "F" (tanggal penuh/waktu lama; string format standar) |
LongDatePattern, untuk menentukan format komponen tanggal string hasil. LongTimePattern, untuk menentukan format komponen waktu dari string hasil. |
| "g" (tanggal umum/waktu singkat; string format standar) |
ShortDatePattern, untuk menentukan format komponen tanggal string hasil. ShortTimePattern, untuk menentukan format komponen waktu dari string hasil. |
| "G" (tanggal umum/waktu lama; string format standar) |
ShortDatePattern, untuk menentukan format komponen tanggal string hasil. LongTimePattern, untuk menentukan format komponen waktu dari string hasil. |
| "M", "m" (bulan/hari; string format standar) | MonthDayPattern, untuk menentukan format keseluruhan string hasil. |
| "O", "o" (tanggal/waktu pulang pergi; string format standar) | None. |
| "R", "r" (RFC1123; format string standar) | RFC1123Pattern, untuk menentukan string hasil yang sesuai dengan standar RFC 1123. Properti bersifat baca-saja. |
| "s" (tanggal/waktu yang dapat diurutkan; string format standar) | SortableDateTimePattern, untuk menentukan string hasil yang sesuai dengan standar ISO 8601. Properti bersifat baca-saja. |
| "t" (waktu singkat; string format standar) | ShortTimePattern, untuk menentukan format keseluruhan string hasil. |
| "T" (waktu lama; string format standar) | LongTimePattern, untuk menentukan format keseluruhan string hasil. |
| "u" (tanggal/waktu yang dapat diurutkan universal; string format standar) | UniversalSortableDateTimePattern, untuk menentukan string hasil yang sesuai dengan standar ISO 8601 untuk waktu universal terkoordinasi. Properti bersifat baca-saja. |
| "U" (tanggal/waktu penuh universal; string format standar) | FullDateTimePattern, untuk menentukan format keseluruhan string hasil. |
| "Y", "y" (bulan tahun; string format standar) | YearMonthPattern, untuk menentukan format keseluruhan string hasil. |
| "ddd" (penentu format kustom) | AbbreviatedDayNames, untuk menyertakan nama singkatan dari hari dalam seminggu dalam string hasil. |
| "g", "gg" (penentu format kustom) | GetEraName Memanggil metode untuk menyisipkan nama era dalam string hasil. |
| "MMM" (penentu format kustom) | AbbreviatedMonthNames atau AbbreviatedMonthGenitiveNames, untuk menyertakan nama bulan yang disingkat dalam string hasil. |
| "MMMM" (spesifikasi format kustom) | MonthNames atau MonthGenitiveNames, untuk menyertakan nama bulan lengkap dalam string hasil. |
| "t" (penentu format kustom) | AMDesignator atau PMDesignator, untuk menyertakan karakter pertama penunjuk AM/PM dalam string hasil. |
| "tt" (penentu format kustom) | AMDesignator atau PMDesignator, untuk menyertakan penunjuk AM/PM lengkap dalam string hasil. |
| ":" (penentu format kustom) | TimeSeparator, untuk menyertakan pemisah waktu dalam string hasil. |
| "/" (penentu format kustom) | DateSeparator, untuk menyertakan pemisah tanggal dalam string hasil. |
Mengubah properti DateTimeFormatInfo
Anda dapat mengubah string hasil yang dihasilkan oleh string format tanggal dan waktu dengan memodifikasi properti terkait dari objek bisa-tulis DateTimeFormatInfo . Untuk menentukan apakah DateTimeFormatInfo objek dapat ditulis, gunakan IsReadOnly properti . Untuk mengkustomisasi objek DateTimeFormatInfo dengan cara ini:
Buat salinan baca/tulis dari objek DateTimeFormatInfo yang konvensi pemformatannya ingin Anda ubah.
Ubah properti atau properti yang digunakan untuk menghasilkan string hasil yang diinginkan. (Untuk informasi tentang cara metode pemformatan menggunakan DateTimeFormatInfo properti untuk menentukan string hasil, lihat bagian sebelumnya, Format string dan properti DateTimeFormatInfo.)
Gunakan objek kustom DateTimeFormatInfo yang Anda buat sebagai argumen IFormatProvider dalam pemanggilan metode pemformatan.
Ada dua cara lain untuk mengubah format string hasil:
Anda dapat menggunakan CultureAndRegionInfoBuilder kelas untuk menentukan budaya kustom (budaya yang memiliki nama unik dan yang melengkapi budaya yang ada) atau budaya pengganti (yang digunakan alih-alih budaya tertentu). Anda dapat menyimpan dan mengakses budaya ini secara terprogram seperti yang Anda lakukan pada objek apa pun yang CultureInfo didukung oleh .NET.
Jika string hasil tidak sensitif terhadap budaya dan tidak mengikuti format yang telah ditentukan sebelumnya, Anda dapat menggunakan string format tanggal dan waktu kustom. Misalnya, jika Anda menserialisasikan data tanggal dan waktu dalam format YYYYMMDDHHmmss, Anda dapat membuat string hasil dengan meneruskan string format kustom ke DateTime.ToString(String) metode , dan Anda dapat mengonversi string hasil kembali ke DateTime nilai dengan memanggil DateTime.ParseExact metode .
Mengubah pola tanggal pendek
Contoh berikut mengubah format string hasil yang dihasilkan oleh string format standar "d" (tanggal pendek). Ini mengubah properti terkait ShortDatePattern untuk budaya en-US atau Inggris (Amerika Serikat) dari default "M/d/yyyy" menjadi "yyyy'-"MM"-"dd" dan menggunakan string format standar "d" untuk menampilkan tanggal sebelum dan sesudah ShortDatePattern properti diubah.
using System;
using System.Globalization;
public class Example1
{
public static void Main()
{
DateTime dateValue = new DateTime(2013, 8, 18);
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo dtfi = enUS.DateTimeFormat;
Console.WriteLine("Before modifying DateTimeFormatInfo object: ");
Console.WriteLine($"{dtfi.ShortDatePattern}: {dateValue.ToString("d", enUS)}\n");
// Modify the short date pattern.
dtfi.ShortDatePattern = "yyyy-MM-dd";
Console.WriteLine("After modifying DateTimeFormatInfo object: ");
Console.WriteLine($"{dtfi.ShortDatePattern}: {dateValue.ToString("d", enUS)}");
}
}
// The example displays the following output:
// Before modifying DateTimeFormatInfo object:
// M/d/yyyy: 8/18/2013
//
// After modifying DateTimeFormatInfo object:
// yyyy-MM-dd: 2013-08-18
Mengubah karakter pemisah tanggal
Contoh berikut mengubah karakter pemisah tanggal dalam DateTimeFormatInfo objek yang mewakili konvensi pemformatan budaya fr-FR. Contoh menggunakan string format standar "g" untuk menampilkan tanggal sebelum dan sesudah DateSeparator properti diubah.
using System;
using System.Globalization;
public class Example3
{
public static void Main()
{
DateTime dateValue = new DateTime(2013, 08, 28);
CultureInfo frFR = CultureInfo.CreateSpecificCulture("fr-FR");
DateTimeFormatInfo dtfi = frFR.DateTimeFormat;
Console.WriteLine($"Before modifying DateSeparator property: {dateValue.ToString("g", frFR)}");
// Modify the date separator.
dtfi.DateSeparator = "-";
Console.WriteLine($"After modifying the DateSeparator property: {dateValue.ToString("g", frFR)}");
}
}
// The example displays the following output:
// Before modifying DateSeparator property: 28/08/2013 00:00
// After modifying the DateSeparator property: 28-08-2013 00:00
Mengubah singkatan nama hari dan pola tanggal yang panjang
Dalam beberapa kasus, pola tanggal panjang, yang biasanya menampilkan nama hari dan bulan penuh bersama dengan jumlah hari dalam sebulan dan tahun, mungkin terlalu panjang. Contoh berikut mempersingkat pola tanggal panjang untuk kultur en-US untuk menghasilkan singkatan nama hari satu atau dua karakter diikuti dengan nomor hari, singkatan nama bulan, dan tahun. Ini dilakukan dengan menetapkan singkatan nama hari yang lebih pendek ke AbbreviatedDayNames array, dan dengan memodifikasi string format kustom yang ditetapkan ke properti LongDatePattern. Ini memengaruhi string hasil yang dikembalikan oleh string format standar "D" dan "f".
using System;
using System.Globalization;
public class Example2
{
public static void Main()
{
DateTime value = new DateTime(2013, 7, 9);
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo dtfi = enUS.DateTimeFormat;
String[] formats = { "D", "F", "f" };
// Display date before modifying properties.
foreach (var fmt in formats)
Console.WriteLine($"{fmt}: {value.ToString(fmt, dtfi)}");
Console.WriteLine();
// We don't want to change the FullDateTimePattern, so we need to save it.
String originalFullDateTimePattern = dtfi.FullDateTimePattern;
// Modify day name abbreviations and long date pattern.
dtfi.AbbreviatedDayNames = new String[] { "Su", "M", "Tu", "W", "Th", "F", "Sa" };
dtfi.LongDatePattern = "ddd dd-MMM-yyyy";
dtfi.FullDateTimePattern = originalFullDateTimePattern;
foreach (var fmt in formats)
Console.WriteLine($"{fmt}: {value.ToString(fmt, dtfi)}");
}
}
// The example displays the following output:
// D: Tuesday, July 9, 2013
// F: Tuesday, July 9, 2013 12:00:00 AM
// f: Tuesday, July 9, 2013 12:00 AM
//
// D: Tu 09-Jul-2013
// F: Tuesday, July 9, 2013 12:00:00 AM
// f: Tu 09-Jul-2013 12:00 AM
Biasanya, perubahan pada LongDatePattern properti juga memengaruhi FullDateTimePattern properti , yang pada gilirannya menentukan string hasil yang dikembalikan oleh string format standar "F". Untuk mempertahankan pola tanggal dan waktu lengkap asli, contoh menetapkan ulang string format kustom asli yang ditetapkan ke FullDateTimePattern properti setelah LongDatePattern properti dimodifikasi.
Ubah dari jam 12 jam menjadi jam 24 jam
Untuk banyak budaya di .NET, waktu diekspresikan dengan menggunakan jam 12 jam dan penunjuk AM/PM. Contoh berikut mendefinisikan ReplaceWith24HourClock metode yang menggantikan format waktu apa pun yang menggunakan jam 12 jam dengan format yang menggunakan jam 24 jam.
using System;
using System.Globalization;
using System.Text.RegularExpressions;
public class Example5
{
public static void Main()
{
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo dtfi = enUS.DateTimeFormat;
Console.WriteLine("Original Property Values:");
Console.WriteLine("ShortTimePattern: " + dtfi.ShortTimePattern);
Console.WriteLine("LongTimePattern: " + dtfi.LongTimePattern);
Console.WriteLine("FullDateTimePattern: " + dtfi.FullDateTimePattern);
Console.WriteLine();
dtfi.LongTimePattern = ReplaceWith24HourClock(dtfi.LongTimePattern);
dtfi.ShortTimePattern = ReplaceWith24HourClock(dtfi.ShortTimePattern);
Console.WriteLine("Modified Property Values:");
Console.WriteLine("ShortTimePattern: " + dtfi.ShortTimePattern);
Console.WriteLine("LongTimePattern: " + dtfi.LongTimePattern);
Console.WriteLine("FullDateTimePattern: " + dtfi.FullDateTimePattern);
}
private static string ReplaceWith24HourClock(string fmt)
{
string pattern = @"^(?<openAMPM>\s*t+\s*)? " +
@"(?(openAMPM) h+(?<nonHours>[^ht]+)$ " +
@"| \s*h+(?<nonHours>[^ht]+)\s*t+)";
return Regex.Replace(fmt, pattern, "HH${nonHours}",
RegexOptions.IgnorePatternWhitespace);
}
}
// The example displays the following output:
// Original Property Values:
// ShortTimePattern: h:mm tt
// LongTimePattern: h:mm:ss tt
// FullDateTimePattern: dddd, MMMM dd, yyyy h:mm:ss tt
//
// Modified Property Values:
// ShortTimePattern: HH:mm
// LongTimePattern: HH:mm:ss
// FullDateTimePattern: dddd, MMMM dd, yyyy HH:mm:ss
Contoh menggunakan ekspresi reguler untuk mengubah string format. Pola @"^(?<openAMPM>\s*t+\s*)? (?(openAMPM) h+(?<nonHours>[^ht]+)$ | \s*h+(?<nonHours>[^ht]+)\s*t+) ekspresi reguler didefinisikan sebagai berikut:
| Pattern | Description |
|---|---|
^ |
Mulai pencocokan dari awal string. |
(?<openAMPM>\s*t+\s*)? |
Cocokkan nol atau satu kemunculan nol atau lebih karakter spasi putih, diikuti dengan huruf "t" satu atau beberapa kali, diikuti dengan nol atau lebih karakter spasi kosong. Grup penangkap ini bernama openAMPM. |
(?(openAMPM) h+(?<nonHours>[^ht]+)$ |
Jika grup memiliki kecocokan openAMPM , cocokkan huruf "h" satu atau beberapa kali, diikuti oleh satu atau beberapa karakter yang bukan "h" atau "t". Kecocokan berakhir di akhir string. Semua karakter yang diambil setelah "h" dimasukkan dalam kelompok pengambilan bernama nonHours. |
| \s*h+(?<nonHours>[^ht]+)\s*t+) |
Jika grup openAMPM tidak memiliki kecocokan, cocokkan huruf "h" satu kali atau lebih, diikuti oleh satu atau beberapa karakter yang bukan "h" atau "t", diikuti oleh nol atau lebih karakter spasi putih. Terakhir, cocokkan satu atau beberapa kemunculan huruf "t". Semua karakter yang diambil setelah "h" dan sebelum spasi putih dan "t" disertakan dalam grup penangkapan bernama nonHours. |
Grup nonHours penangkapan berisi komponen menit dan mungkin komponen detik dari string format tanggal dan waktu kustom, bersama dengan simbol pemisah waktu apa pun. Pola HH${nonHours} penggantian menambahkan substring "HH" ke elemen-elemen ini.
Menampilkan dan mengubah era dalam tanggal
Contoh berikut menambahkan penentu format kustom "g" ke LongDatePattern properti objek yang mewakili konvensi pemformatan budaya en-US. Penambahan ini memengaruhi tiga string format standar berikut:
- String format standar "D" (tanggal panjang), yang memetakan langsung ke properti LongDatePattern.
- String format standar "f" (tanggal penuh/waktu singkat), yang menghasilkan string hasil yang menggabungkan substring yang dihasilkan oleh properti LongDatePattern dan ShortTimePattern.
- String format standar "F" (tanggal penuh/waktu panjang), yang memetakan langsung ke FullDateTimePattern properti. Karena kami belum secara eksplisit menetapkan nilai properti ini, nilai ini dihasilkan secara dinamis dengan menggabungkan LongDatePattern properti dan LongTimePattern .
Contohnya juga menunjukkan cara mengubah nama era untuk budaya yang kalendernya memiliki satu era. Dalam hal ini, budaya en-AS menggunakan kalender Gregorian, yang diwakili oleh objek GregorianCalendar . Kelas ini GregorianCalendar mendukung satu era, yang dinamai A.D. (Anno Domini). Contoh mengubah nama era menjadi C.E. (Common Era) dengan mengganti penentu format kustom "g" dalam string format yang ditetapkan ke FullDateTimePattern properti dengan string literal. Penggunaan string literal diperlukan karena nama era biasanya dikembalikan oleh metode GetEraName dari data privat dalam tabel budaya tersebut yang disediakan oleh .NET atau sistem operasi.
using System;
using System.Globalization;
public class Example4
{
public static void Main()
{
DateTime dateValue = new DateTime(2013, 5, 18, 13, 30, 0);
String[] formats = { "D", "f", "F" };
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo dtfi = enUS.DateTimeFormat;
String originalLongDatePattern = dtfi.LongDatePattern;
// Display the default form of three long date formats.
foreach (var fmt in formats)
Console.WriteLine(dateValue.ToString(fmt, dtfi));
Console.WriteLine();
// Modify the long date pattern.
dtfi.LongDatePattern = originalLongDatePattern + " g";
foreach (var fmt in formats)
Console.WriteLine(dateValue.ToString(fmt, dtfi));
Console.WriteLine();
// Change A.D. to C.E. (for Common Era)
dtfi.LongDatePattern = originalLongDatePattern + @" 'C.E.'";
foreach (var fmt in formats)
Console.WriteLine(dateValue.ToString(fmt, dtfi));
}
}
// The example displays the following output:
// Saturday, May 18, 2013
// Saturday, May 18, 2013 1:30 PM
// Saturday, May 18, 2013 1:30:00 PM
//
// Saturday, May 18, 2013 A.D.
// Saturday, May 18, 2013 A.D. 1:30 PM
// Saturday, May 18, 2013 A.D. 1:30:00 PM
//
// Saturday, May 18, 2013 C.E.
// Saturday, May 18, 2013 C.E. 1:30 PM
// Saturday, May 18, 2013 C.E. 1:30:00 PM
Mengurai string tanggal dan waktu
Penguraian melibatkan konversi representasi string tanggal dan waktu ke nilai DateTime atau DateTimeOffset. Kedua jenis ini termasuk Parse, metode TryParse, ParseExact, dan TryParseExact untuk mendukung operasi penguraian. Metode Parse dan TryParse mengonversi string yang dapat memiliki berbagai format, sedangkan ParseExact dan TryParseExact mengharuskan string memiliki format atau format yang ditentukan. Jika operasi penguraian gagal, Parse dan ParseExact melemparkan pengecualian, sedangkan TryParse dan TryParseExact mengembalikan false.
Metode penguraian secara implisit atau eksplisit menggunakan DateTimeStyles nilai enumerasi untuk menentukan elemen gaya mana (seperti spasi putih awal, akhir, atau dalam) yang dapat hadir dalam string yang akan diurai, dan bagaimana mengartikan string yang diurai atau elemen yang hilang. Jika Anda tidak memberikan nilai DateTimeStyles saat memanggil metode Parse atau TryParse, defaultnya adalah DateTimeStyles.AllowWhiteSpaces, yang merupakan gaya komposit yang menyertakan bendera DateTimeStyles.AllowLeadingWhite, DateTimeStyles.AllowTrailingWhite, dan DateTimeStyles.AllowInnerWhite.
ParseExact Untuk metode dan TryParseExact , defaultnya adalah DateTimeStyles.None; string input harus sesuai dengan string format tanggal dan waktu kustom tertentu.
Metode penguraian juga secara implisit atau eksplisit menggunakan DateTimeFormatInfo objek yang menentukan simbol dan pola tertentu yang dapat terjadi dalam string yang akan diurai. Jika Anda tidak menyediakan DateTimeFormatInfo objek, DateTimeFormatInfo objek untuk budaya saat ini digunakan secara default. Untuk informasi selengkapnya tentang penguraian string tanggal dan waktu, lihat metode penguraian individual, seperti DateTime.Parse, , DateTime.TryParseDateTimeOffset.ParseExact, dan DateTimeOffset.TryParseExact.
Contoh berikut mengilustrasikan sifat sensitif budaya dari penguraian string tanggal dan waktu. Ini mencoba mengurai dua string tanggal dengan menggunakan konvensi budaya en-US, en-GB, fr-FR, dan fi-FI. Tanggal yang ditafsirkan sebagai 18/8/2014 dalam budaya en-AS melemparkan FormatException pengecualian dalam tiga budaya lainnya karena 18 ditafsirkan sebagai nomor bulan. 1/2/2015 diurai sebagai hari kedua bulan pertama dalam budaya en-US, tetapi sebagai hari pertama bulan kedua di sisa budaya.
using System;
using System.Globalization;
public class ParseEx1
{
public static void Main()
{
string[] dateStrings = { "08/18/2014", "01/02/2015" };
string[] cultureNames = { "en-US", "en-GB", "fr-FR", "fi-FI" };
foreach (var cultureName in cultureNames)
{
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
Console.WriteLine($"Parsing strings using the {culture.Name} culture.");
foreach (var dateStr in dateStrings)
{
try
{
Console.WriteLine(String.Format(culture,
" '{0}' --> {1:D}", dateStr,
DateTime.Parse(dateStr, culture)));
}
catch (FormatException)
{
Console.WriteLine($" Unable to parse '{dateStr}'");
}
}
}
}
}
// The example displays the following output:
// Parsing strings using the en-US culture.
// '08/18/2014' --> Monday, August 18, 2014
// '01/02/2015' --> Friday, January 02, 2015
// Parsing strings using the en-GB culture.
// Unable to parse '08/18/2014'
// '01/02/2015' --> 01 February 2015
// Parsing strings using the fr-FR culture.
// Unable to parse '08/18/2014'
// '01/02/2015' --> dimanche 1 février 2015
// Parsing strings using the fi-FI culture.
// Unable to parse '08/18/2014'
// '01/02/2015' --> 1. helmikuuta 2015
String tanggal dan waktu biasanya diurai karena dua alasan:
- Untuk mengonversi input pengguna menjadi nilai tanggal dan waktu.
- Untuk melakukan round-trip nilai tanggal dan waktu; yaitu, untuk mendeserialisasi nilai tanggal dan waktu yang sebelumnya telah diserialisasi sebagai string.
Bagian berikut membahas kedua operasi ini secara lebih rinci.
Mengurai string pengguna
Saat mengurai string input tanggal dan waktu dari pengguna, Anda harus selalu membuat objek DateTimeFormatInfo yang mencerminkan pengaturan budaya pengguna, termasuk penyesuaian yang mungkin telah mereka buat. Jika tidak, objek tanggal dan waktu mungkin memiliki nilai yang salah. Untuk informasi tentang cara membuat objek instans DateTimeFormatInfo yang mencerminkan kustomisasi budaya pengguna, lihat bagian DateTimeFormatInfo dan data dinamis.
Contoh berikut mengilustrasikan perbedaan antara operasi penguraian yang mencerminkan pengaturan budaya pengguna dan yang tidak. Dalam hal ini, budaya sistem default adalah en-US, tetapi pengguna telah menggunakan Panel Kontrol, Wilayah dan Bahasa untuk mengubah pola tanggal pendek dari default "M/d/yyyy" menjadi "yy/MM/dd". Saat pengguna memasukkan string yang mencerminkan pengaturan pengguna, dan string tersebut diurai oleh objek DateTimeFormatInfo yang juga mencerminkan pengaturan pengguna (penggantian), operasi penguraian akan menghasilkan hasil yang benar. Namun, ketika string diurai oleh DateTimeFormatInfo objek yang mencerminkan pengaturan budaya en-US standar, metode penguraian melemparkan FormatException pengecualian karena menafsirkan 14 sebagai jumlah bulan, bukan dua digit terakhir tahun.
using System;
using System.Globalization;
public class ParseEx2
{
public static void Main()
{
string inputDate = "14/05/10";
CultureInfo[] cultures = { CultureInfo.GetCultureInfo("en-US"),
CultureInfo.CreateSpecificCulture("en-US") };
foreach (var culture in cultures)
{
try
{
Console.WriteLine($"{culture.Name} culture reflects user overrides: {culture.UseUserOverride}");
DateTime occasion = DateTime.Parse(inputDate, culture);
Console.WriteLine($"'{inputDate}' --> {occasion.ToString("D", CultureInfo.InvariantCulture)}");
}
catch (FormatException)
{
Console.WriteLine($"Unable to parse '{inputDate}'");
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// en-US culture reflects user overrides: False
// Unable to parse '14/05/10'
//
// en-US culture reflects user overrides: True
// '14/05/10' --> Saturday, 10 May 2014
Serialisasi dan deserialisasi data tanggal dan waktu
Data tanggal dan waktu yang diserialisasikan diharapkan untuk pulang-pergi; artinya, semua nilai berseri dan deserialisasi harus identik. Jika nilai tanggal dan waktu mewakili satu momen, nilai yang dideserialisasi harus mewakili momen yang sama tanpa terpengaruh budaya atau zona waktu sistem tempat dipulihkannya. Agar data tanggal dan waktu pulang pergi berhasil, Anda harus menggunakan konvensi budaya invarian, yang dikembalikan oleh InvariantInfo properti, untuk menghasilkan dan mengurai data. Operasi pemformatan dan penguraian tidak boleh mencerminkan konvensi budaya default. Jika Anda menggunakan pengaturan budaya bawaan, portabilitas data sangat terbatas; data tersebut hanya dapat dideserialisasi pada utas yang pengaturan khusus budayanya identik dengan utas tempat data tersebut diserialisasi. Dalam beberapa kasus, ini berarti bahwa data bahkan tidak dapat berhasil diserialisasikan dan dideserialisasi pada sistem yang sama.
Jika komponen waktu dari nilai tanggal dan waktu dianggap signifikan, itu juga harus dikonversi ke UTC dan diserialisasikan dengan menggunakan string format standar "o" atau "r". Data waktu kemudian dapat dipulihkan dengan memanggil metode penguraian dan meneruskannya string format yang sesuai bersama dengan budaya invarian sebagai provider argumen.
Contoh berikut mengilustrasikan proses round-tripping nilai tanggal dan waktu. Ini mengubah tanggal dan waktu menjadi format serial pada sistem yang mengamati zona waktu Pasifik Amerika Serikat dan yang pengaturan lokalnya saat ini adalah en-US.
using System;
using System.Globalization;
using System.IO;
public class SerializeEx1
{
public static void Main()
{
StreamWriter sw = new StreamWriter(@".\DateData.dat");
// Define a date and time to serialize.
DateTime originalDate = new DateTime(2014, 08, 18, 08, 16, 35);
// Display information on the date and time.
Console.WriteLine($"Date to serialize: {originalDate:F}");
Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine($"Time Zone: {TimeZoneInfo.Local.DisplayName}");
// Convert the date value to UTC.
DateTime utcDate = originalDate.ToUniversalTime();
// Serialize the UTC value.
sw.Write(utcDate.ToString("o", DateTimeFormatInfo.InvariantInfo));
sw.Close();
}
}
// The example displays the following output:
// Date to serialize: Monday, August 18, 2014 8:16:35 AM
// Current Culture: en-US
// Time Zone: (UTC-08:00) Pacific Time (US & Canada)
Ini mendeserialisasi data pada sistem di zona waktu Brussels, Kopenhagen, Madrid dan Paris dan yang budayanya saat ini adalah fr-FR. Tanggal yang dipulihkan adalah sembilan jam lebih lambat dari tanggal asli, yang mencerminkan penyesuaian zona waktu dari delapan jam di belakang UTC hingga satu jam lebih awal dari UTC. Tanggal asli dan tanggal yang dipulihkan menunjukkan momen yang sama pada waktunya.
using System;
using System.Globalization;
using System.IO;
public class SerializeEx2
{
public static void Main()
{
// Open the file and retrieve the date string.
StreamReader sr = new StreamReader(@".\DateData.dat");
String dateValue = sr.ReadToEnd();
// Parse the date.
DateTime parsedDate = DateTime.ParseExact(dateValue, "o",
DateTimeFormatInfo.InvariantInfo);
// Convert it to local time.
DateTime restoredDate = parsedDate.ToLocalTime();
// Display information on the date and time.
Console.WriteLine($"Deserialized date: {restoredDate:F}");
Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine($"Time Zone: {TimeZoneInfo.Local.DisplayName}");
}
}
// The example displays the following output:
// Deserialized date: lundi 18 août 2014 17:16:35
// Current Culture: fr-FR
// Time Zone: (UTC+01:00) Brussels, Copenhagen, Madrid, Paris
Konstruktor
| Nama | Deskripsi |
|---|---|
| DateTimeFormatInfo() |
Menginisialisasi instans baru yang dapat ditulis dari DateTimeFormatInfo kelas yang independen budaya (invarian). |
Properti
| Nama | Deskripsi |
|---|---|
| AbbreviatedDayNames |
Mendapatkan atau menetapkan array jenis String satu dimensi yang berisi nama singkatan khusus budaya dari hari dalam seminggu. |
| AbbreviatedMonthGenitiveNames |
Mendapatkan atau mengatur array string dari nama bulan singkatan yang terkait dengan objek saat ini DateTimeFormatInfo . |
| AbbreviatedMonthNames |
Mendapatkan atau menetapkan array string satu dimensi yang berisi nama singkatan khusus budaya dari bulan tersebut. |
| AMDesignator |
Mendapatkan atau mengatur penunjuk string selama berjam-jam yang merupakan "ante meridiem" (sebelum siang). |
| Calendar |
Mendapatkan atau mengatur kalender yang akan digunakan untuk budaya saat ini. |
| CalendarWeekRule |
Mendapatkan atau menetapkan nilai yang menentukan aturan mana yang digunakan untuk menentukan minggu kalender pertama dalam setahun. |
| CurrentInfo |
Mendapatkan objek baca-saja DateTimeFormatInfo yang memformat nilai berdasarkan budaya saat ini. |
| DateSeparator |
Mendapatkan atau mengatur string yang memisahkan komponen tanggal, yaitu, tahun, bulan, dan hari. |
| DayNames |
Mendapatkan atau menetapkan array string satu dimensi yang berisi nama lengkap khusus budaya dari hari dalam seminggu. |
| FirstDayOfWeek |
Mendapatkan atau mengatur hari pertama dalam seminggu. |
| FullDateTimePattern |
Mendapatkan atau mengatur string format kustom untuk tanggal panjang dan nilai waktu yang lama. |
| InvariantInfo |
Mendapatkan objek baca-saja DateTimeFormatInfo default yang independen budaya (invarian). |
| IsReadOnly |
Mendapatkan nilai yang menunjukkan apakah objek DateTimeFormatInfo bersifat baca-saja. |
| LongDatePattern |
Mendapatkan atau mengatur string format kustom untuk nilai tanggal panjang. |
| LongTimePattern |
Mendapatkan atau mengatur string format kustom untuk nilai waktu yang lama. |
| MonthDayPattern |
Mendapatkan atau mengatur string format kustom untuk nilai bulan dan hari. |
| MonthGenitiveNames |
Mendapatkan atau mengatur array string nama bulan yang terkait dengan objek saat ini DateTimeFormatInfo . |
| MonthNames |
Mendapatkan atau menetapkan array jenis String satu dimensi yang berisi nama lengkap khusus budaya bulan tersebut. |
| NativeCalendarName |
Mendapatkan nama asli kalender yang terkait dengan objek saat ini DateTimeFormatInfo . |
| PMDesignator |
Mendapatkan atau mengatur penunjuk string selama berjam-jam yaitu "post meridiem" (setelah siang). |
| RFC1123Pattern |
Mendapatkan string format kustom untuk nilai waktu yang didasarkan pada spesifikasi Permintaan Komentar (RFC) Internet Engineering Task Force (IETF). |
| ShortDatePattern |
Mendapatkan atau mengatur string format kustom untuk nilai tanggal pendek. |
| ShortestDayNames |
Mendapatkan atau mengatur array string dari nama hari singkatan terpendek yang terkait dengan objek saat ini DateTimeFormatInfo . |
| ShortTimePattern |
Mendapatkan atau mengatur string format kustom untuk nilai waktu singkat. |
| SortableDateTimePattern |
Mendapatkan string format kustom untuk nilai tanggal dan waktu yang dapat diurutkan. |
| TimeSeparator |
Mendapatkan atau mengatur string yang memisahkan komponen waktu, yaitu jam, menit, dan detik. |
| UniversalSortableDateTimePattern |
Mendapatkan string format kustom untuk string tanggal dan waktu universal yang dapat diurutkan, seperti yang didefinisikan oleh ISO 8601. |
| YearMonthPattern |
Mendapatkan atau mengatur string format kustom untuk nilai tahun dan bulan. |
Metode
| Nama | Deskripsi |
|---|---|
| Clone() |
Membuat salinan dangkal dari DateTimeFormatInfo. |
| Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
| GetAbbreviatedDayName(DayOfWeek) |
Mengembalikan nama singkatan khusus budaya dari hari yang ditentukan dalam seminggu berdasarkan budaya yang terkait dengan objek saat ini DateTimeFormatInfo . |
| GetAbbreviatedEraName(Int32) |
Mengembalikan string yang berisi nama singkatan dari era yang ditentukan, jika ada singkatan. |
| GetAbbreviatedMonthName(Int32) |
Mengembalikan nama singkatan khusus budaya dari bulan yang ditentukan berdasarkan budaya yang terkait dengan objek saat ini DateTimeFormatInfo . |
| GetAllDateTimePatterns() |
Mengembalikan semua pola standar di mana nilai tanggal dan waktu dapat diformat. |
| GetAllDateTimePatterns(Char) |
Mengembalikan semua pola di mana nilai tanggal dan waktu dapat diformat menggunakan string format standar yang ditentukan. |
| GetDayName(DayOfWeek) |
Mengembalikan nama lengkap khusus budaya dari hari yang ditentukan dalam seminggu berdasarkan budaya yang terkait dengan objek saat ini DateTimeFormatInfo . |
| GetEra(String) |
Mengembalikan bilangan bulat yang mewakili era yang ditentukan. |
| GetEraName(Int32) |
Mengembalikan string yang berisi nama era yang ditentukan. |
| GetFormat(Type) |
Mengembalikan objek dari jenis yang ditentukan yang menyediakan layanan pemformatan tanggal dan waktu. |
| GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
| GetInstance(IFormatProvider) |
Mengembalikan objek yang DateTimeFormatInfo terkait dengan IFormatProvider. |
| GetMonthName(Int32) |
Mengembalikan nama lengkap khusus budaya dari bulan yang ditentukan berdasarkan budaya yang terkait dengan objek saat ini DateTimeFormatInfo . |
| GetShortestDayName(DayOfWeek) |
Mendapatkan nama hari yang disingkat terpendek untuk hari tertentu dalam seminggu yang terkait dengan objek saat ini DateTimeFormatInfo . |
| GetType() |
Mendapatkan Type instans saat ini. (Diperoleh dari Object) |
| MemberwiseClone() |
Membuat salinan dangkal dari Objectsaat ini. (Diperoleh dari Object) |
| ReadOnly(DateTimeFormatInfo) |
Mengembalikan pembungkus DateTimeFormatInfo baca-saja. |
| SetAllDateTimePatterns(String[], Char) |
Mengatur string format tanggal dan waktu kustom yang sesuai dengan string format standar tertentu. |
| ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |
Implementasi Antarmuka Eksplisit
| Nama | Deskripsi |
|---|---|
| ISerializable.GetObjectData(SerializationInfo, StreamingContext) |
Mengisi SerializationInfo dengan data yang diperlukan untuk membuat serialisasi objek target. |