Bagikan melalui


DateTimeFormatInfo kelas

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

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.
  • Perancang A.M. dan P.M. yang digunakan dalam nilai waktu.
  • Kalender tempat tanggal dinyatakan.

Membuat instans 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 DateTimeFormatInfo instans objek yang mewakili konvensi pemformatan budaya invarian dengan cara berikut:

Contoh berikut menggunakan masing-masing metode ini untuk membuat instans DateTimeFormatInfo objek yang mewakili budaya invarian. Kemudian menunjukkan apakah objek bersifat baca-saja.

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 dalam 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:

Contoh berikut mengilustrasikan DateTimeFormatInfo masing-masing cara ini untuk membuat instans objek 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("{0} from CreateSpecificCulture: {1}", ci.Name, dtfi.IsReadOnly);

// Instantiate a culture using the CultureInfo constructor.
ci = new System.Globalization.CultureInfo("en-CA");
dtfi = ci.DateTimeFormat;
Console.WriteLine("{0} from CultureInfo constructor: {1}", ci.Name, dtfi.IsReadOnly);

// Retrieve a culture by calling the GetCultureInfo method.
ci = System.Globalization.CultureInfo.GetCultureInfo("en-AU");
dtfi = ci.DateTimeFormat;
Console.WriteLine("{0} from GetCultureInfo: {1}", ci.Name, 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("{0} from GetInstance: {1}", ci.Name, 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 yang DateTimeFormatInfo dikembalikan oleh propertinya CultureInfo.DateTimeFormat . Kecuali budaya induk mewakili budaya invarian, objek yang dikembalikan DateTimeFormatInfo adalah baca/tulis. Contoh berikut menggambarkan cara-cara membuat instans DateTimeFormatInfo objek yang mewakili budaya 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("{0} from Parent property: {1}", neutral.Name, dtfi.IsReadOnly);

dtfi = System.Globalization.CultureInfo.GetCultureInfo("fr-FR").Parent.DateTimeFormat;
Console.WriteLine("{0} from Parent property: {1}", neutral.Name, dtfi.IsReadOnly);

// Instantiate a neutral culture using the CultureInfo constructor.
neutral = new System.Globalization.CultureInfo("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine("{0} from CultureInfo constructor: {1}", neutral.Name, dtfi.IsReadOnly);

// Instantiate a culture using CreateSpecificCulture.
neutral = System.Globalization.CultureInfo.CreateSpecificCulture("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine("{0} from CreateSpecificCulture: {1}", neutral.Name, dtfi.IsReadOnly);

// Retrieve a culture by calling the GetCultureInfo method.
neutral = System.Globalization.CultureInfo.GetCultureInfo("fr");
dtfi = neutral.DateTimeFormat;
Console.WriteLine("{0} from GetCultureInfo: {1}", neutral.Name, dtfi.IsReadOnly);

// Instantiate a DateTimeFormatInfo object by calling GetInstance.
neutral = System.Globalization.CultureInfo.CreateSpecificCulture("fr");
dtfi = System.Globalization.DateTimeFormatInfo.GetInstance(neutral);
Console.WriteLine("{0} from GetInstance: {1}", neutral.Name, 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-AS, 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 {2} array for {0} and {1}", name, ci.Name, prop.Name);
                        break;
                    }

                    for (int ctr = 0; ctr < nList.Count; ctr++)
                    {
                        if (!nList[ctr].Equals(sList[ctr]))
                        {
                            match = false;
                            Console.WriteLine("   {0} value different for {1} and {2}", prop.Name, name, 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 {0} and {1}", name, ci.Name);
                            match = false;
                            break;
                        }

                        if (specificValue is GregorianCalendar)
                        {
                            if (((GregorianCalendar)specificValue).CalendarType != ((GregorianCalendar)neutralValue).CalendarType)
                            {
                                Console.WriteLine("   Different Gregorian calendar types for {0} and {1}", name, ci.Name);
                                match = false;
                                break;
                            }
                        }
                    }
                    else if (!specificValue.Equals(neutralValue))
                    {
                        match = false;
                        Console.WriteLine("   Different {0} values for {1} and {2}", prop.Name, name, ci.Name);
                        break;
                    }
                }
            }
            if (match)
            {
                Console.WriteLine("DateTimeFormatInfo object for '{0}' matches '{1}'",
                                  name, ci.Name);
                hasOneMatch = true;
            }
        }
        if (!hasOneMatch)
            Console.WriteLine("DateTimeFormatInfo object for '{0}' --> No Match", name);

        Console.WriteLine();
    }
}

Membuat instans objek DateTimeFormatInfo untuk budaya saat ini

Anda dapat membuat DateTimeFormatInfo instans objek yang mewakili konvensi pemformatan budaya saat ini dengan cara berikut:

Contoh berikut menggunakan masing-masing metode ini untuk membuat instans DateTimeFormatInfo objek yang mewakili konvensi pemformatan budaya saat ini. Kemudian menunjukkan apakah objek bersifat baca-saja.

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:

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 dibahas sebelumnya semuanya mencerminkan penimpaan pengguna ini. Jika ini tidak diinginkan, Anda dapat membuat NumberFormatInfo objek yang tidak mencerminkan penimpaan false pengguna (dan juga baca/tulis alih-alih baca-saja) dengan memanggil CultureInfo.CultureInfo(String, Boolean) konstruktor dan menyediakan nilai untuk useUserOverride argumen. 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:      {0}", culture.Name);
        Console.WriteLine("User Overrides:    {0}", culture.UseUserOverride);
        Console.WriteLine("Long Time Pattern: {0}\n", culture.DateTimeFormat.LongTimePattern);

        culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
        Console.WriteLine("Culture Name:      {0}", culture.Name);
        Console.WriteLine("User Overrides:    {0}", culture.UseUserOverride);
        Console.WriteLine("Long Time Pattern: {0}\n", culture.DateTimeFormat.LongTimePattern);
    }
}
// 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 pada DateTimeFormatInfo nilai properti untuk budaya tertentu.

  • Kultur penggantian. Kelas CultureAndRegionInfoBuilder dapat digunakan untuk menggantikan data budaya yang ada.

  • Berskala perubahan pada nilai properti. Sejumlah properti terkait budaya dapat berubah pada waktu proses, yang, pada gilirannya, menyebabkan DateTimeFormatInfo data berubah. Misalnya, budaya saat ini dapat diubah baik secara terprogram atau melalui tindakan pengguna. Ketika ini terjadi, objek yang DateTimeFormatInfo dikembalikan oleh CurrentInfo properti berubah menjadi objek yang terkait dengan budaya 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. CultureInfo.UseUserOverride Jika properti diatur ke true, properti DateTimeFormatInfo objek 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 yang DateTimeFormatInfo dapat diganti pengguna diinisialisasi saat objek dibuat. Masih ada kemungkinan ketidakkonsistensian, karena tidak ada pembuatan objek maupun proses penimpaan pengguna yang atomik dan 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 budaya yang sama dengan budaya sistem. Tabel berikut mencantumkan cara DateTimeFormatInfo objek dapat diambil dan menunjukkan apakah objek yang dihasilkan mencerminkan penimpaan pengguna.

Sumber objek CultureInfo dan DateTimeFormatInfo Mencerminkan penimpaan pengguna
Properti CultureInfo.CurrentCulture.DateTimeFormat Ya
Properti DateTimeFormatInfo.CurrentInfo Ya
metode CultureInfo.CreateSpecificCulture Ya
metode CultureInfo.GetCultureInfo No
Konstruktor CultureInfo.CultureInfo(String) Ya
Konstruktor CultureInfo.CultureInfo(String, Boolean) 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, Anda tidak boleh. 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 termasuk panggilan ke metode berikut:

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 jenis tersebut atau null jika tidak dapat memberikan instans jenis. .NET mencakup dua IFormatProvider implementasi untuk memformat tanggal dan waktu:

IFormatProvider Jika implementasi tidak diberikan ke metode pemformatan secara eksplisit, CultureInfo objek yang dikembalikan oleh CultureInfo.CurrentCulture properti yang mewakili budaya saat ini 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, Decimal.ToString(IFormatProvider) metode meminta DateTimeFormatInfo objek untuk memberikan informasi pemformatan, sedangkan String.Format(IFormatProvider, String, Object[]) permintaan NumberFormatInfo metode dan DateTimeFormatInfo objek serta ICustomFormatter implementasi.

using System;
using System.Globalization;

public class CurrentCultureFormatProvider : IFormatProvider
{
    public Object GetFormat(Type formatType)
    {
        Console.WriteLine("Requesting an object of type {0}",
                          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 DateTime(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:

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 terkait dengan string atau substring yang dimasukkan 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 hanya DateTimeFormatInfo mencantumkan properti yang string format standarnya adalah alias, dan tidak mencantumkan properti yang dapat diakses oleh string format kustom yang ditetapkan ke properti alias tersebut. Selain itu, tabel hanya mencantumkan penentu format kustom yang sesuai dengan DateTimeFormatInfo properti.

Penentu 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) Tidak ada.
"R", "r" (RFC1123; string format 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, untuk menyertakan nama bulan yang disingkat dalam string hasil.
"MMMM" (penentu 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 dengan DateTimeFormatInfo cara ini:

  1. Buat salinan baca/tulis objek yang DateTimeFormatInfo konvensi pemformatannya ingin Anda ubah.

  2. 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.)

  3. Gunakan objek kustom DateTimeFormatInfo yang Anda buat sebagai IFormatProvider argumen dalam panggilan ke 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("{0}: {1}\n", dtfi.ShortDatePattern,
                                      dateValue.ToString("d", enUS));

        // Modify the short date pattern.
        dtfi.ShortDatePattern = "yyyy-MM-dd";
        Console.WriteLine("After modifying DateTimeFormatInfo object: ");
        Console.WriteLine("{0}: {1}", 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: {0}",
                          dateValue.ToString("g", frFR));

        // Modify the date separator.
        dtfi.DateSeparator = "-";
        Console.WriteLine("After modifying the DateSeparator property: {0}",
                          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 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 budaya en-AS untuk mengembalikan singkatan nama hari satu karakter 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 LongDatePattern properti . 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("{0}: {1}", 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("{0}: {1}", 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("Modififed 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
//
//       Modififed 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:

Pola Deskripsi
^ Mulailah pencocokan di 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" disertakan dalam grup pengambilan bernama nonHours.
&#124; \s*h+(?<nonHours>[^ht]+)\s*t+) openAMPM Jika grup tidak memiliki kecocokan, cocok dengan huruf "h" satu atau beberapa kali, 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 menit dan mungkin komponen kedua dari string format tanggal dan waktu kustom, bersama dengan simbol pemisah kapan saja. 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 LongDatePattern properti .

  • String format standar "f" (tanggal penuh/waktu singkat), yang menghasilkan string hasil yang menggabungkan substring yang dihasilkan oleh LongDatePattern properti dan ShortTimePattern .

  • String format standar "F" (tanggal penuh/waktu lama), 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 GetEraName metode dari data privat dalam tabel budaya 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 menjadi DateTime nilai atau DateTimeOffset . Kedua jenis ini termasuk Parsemetode , 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 di depan, di belakang, atau dalam) dapat hadir dalam string yang akan diurai, dan cara menginterpretasikan string yang diurai atau elemen yang hilang. Jika Anda tidak memberikan DateTimeStyles nilai saat memanggil Parse metode atau TryParse , defaultnya adalah DateTimeStyles.AllowWhiteSpaces, yang merupakan gaya komposit yang menyertakan DateTimeStyles.AllowLeadingWhitebendera , 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-AS, 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 {0} culture.",
                              culture.Name);
            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 '{0}'", 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 diserialisasikan sebagai string.

Bagian berikut membahas kedua operasi ini secara lebih rinci.

Mengurai string pengguna

Saat Anda mengurai input string tanggal dan waktu oleh pengguna, Anda harus selalu membuat DateTimeFormatInfo objek yang mencerminkan pengaturan budaya pengguna, termasuk penyesuaian apa pun yang mungkin dibuat pengguna. Jika tidak, objek tanggal dan waktu mungkin memiliki nilai yang salah. Untuk informasi tentang cara membuat DateTimeFormatInfo instans objek 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 diurai oleh DateTimeFormatInfo objek yang juga mencerminkan pengaturan pengguna (penimpaan), operasi penguraian mengembalikan hasil yang benar. Namun, ketika string diurai oleh DateTimeFormatInfo objek yang mencerminkan pengaturan budaya en-AS standar, metode penguraian melemparkan FormatException pengecualian karena menafsirkan 14 sebagai jumlah bulan, bukan dua digit terakhir tahun ini.

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("{0} culture reflects user overrides: {1}",
                                  culture.Name, culture.UseUserOverride);
                DateTime occasion = DateTime.Parse(inputDate, culture);
                Console.WriteLine("'{0}' --> {1}", inputDate,
                                  occasion.ToString("D", CultureInfo.InvariantCulture));
            }
            catch (FormatException)
            {
                Console.WriteLine("Unable to parse '{0}'", 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

Menserialisasikan dan mendeserialisasi 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 dalam waktu, nilai yang dideserialisasi harus mewakili momen yang sama dalam waktu terlepas dari budaya atau zona waktu sistem tempatnya dipulihkan. 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 default, portabilitas data sangat terbatas; itu dapat berhasil dideserialisasi hanya pada utas yang pengaturan khusus budayanya identik dengan utas yang diserialisasikannya. Dalam beberapa kasus, ini berarti bahwa data bahkan tidak dapat berhasil diserialisasikan dan dideserialisasi pada sistem yang sama.

Jika komponen waktu nilai tanggal dan waktu signifikan, komponen waktu 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 menserialisasikan tanggal dan waktu pada sistem yang mengamati waktu Pasifik A.S. dan yang budayanya 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: {0:F}", originalDate);
        Console.WriteLine("Current Culture:   {0}",
                          CultureInfo.CurrentCulture.Name);
        Console.WriteLine("Time Zone:         {0}",
                          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: {0:F}", restoredDate);
        Console.WriteLine("Current Culture:   {0}",
                          CultureInfo.CurrentCulture.Name);
        Console.WriteLine("Time Zone:         {0}",
                          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