DateTimeFormatInfo Класс

Определение

Предоставляет сведения о форматировании значений даты и времени, связанные с языком и региональными параметрами.

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
Наследование
DateTimeFormatInfo
Атрибуты
Реализации

Примеры

В следующем примере отражение используется для получения свойств DateTimeFormatInfo объекта для языка и региональных параметров "Английский (США)". Он отображает значения этих свойств, которые содержат строки настраиваемого формата, и использует эти строки для отображения форматированных дат.

using System;
using System.Globalization;
using System.Reflection;

public class Example
{
   public static void Main()
   {
      // 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

Комментарии

Свойства DateTimeFormatInfo класса содержат сведения, относящиеся к языку и региональным параметрам, для форматирования или синтаксического анализа значений даты и времени, как показано ниже:

  • Шаблоны, используемые для форматирования значений даты.

  • Шаблоны, используемые для форматирования значений времени.

  • Названия дней недели.

  • Названия месяцев года.

  • A.M. и после полудня обозначения, используемые в значениях времени.

  • Календарь, в котором выражаются даты.

Содержание

Создание экземпляра объекта DateTimeFormatInfo

DateTimeFormatInfoОбъект может представлять соглашения о форматировании инвариантного языка, конкретного языка и региональных параметров, нейтрального языка и региональных параметров. В этом разделе описывается создание экземпляра каждого типа DateTimeFormatInfo объекта.

Создание экземпляра объекта DateTimeFormatInfo для инвариантного языка и региональных параметров

Инвариантная культура представляет язык и региональные параметры, не учитывающие язык и региональные параметры. Он основан на английском языке, но не в какой-либо стране или регионе, говорящей на английском языке. Хотя данные определенных языков и региональных параметров могут быть динамическими и могут меняться в соответствии с новыми региональными соглашениями или предпочтениями пользователя, данные инвариантного языка и региональных параметров не меняются. Создать экземпляр DateTimeFormatInfo объекта, который представляет соглашения о форматировании инвариантного языка и региональных параметров, можно следующими способами.

  • Путем извлечения значения InvariantInfo Свойства. Возвращаемый DateTimeFormatInfo объект доступен только для чтения.

  • Путем вызова конструктора без параметров DateTimeFormatInfo . Возвращаемый объект DateTimeFormatInfo доступен для чтения и записи.

  • Путем получения значения DateTimeFormat свойства из CultureInfo объекта, возвращаемого CultureInfo.InvariantCulture свойством. Возвращаемый DateTimeFormatInfo объект доступен только для чтения.

В следующем примере каждый из этих методов используется для создания экземпляра DateTimeFormatInfo объекта, представляющего инвариантный язык и региональные параметры. Затем он указывает, доступен ли объект только для чтения.

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
Dim dtfi As System.Globalization.DateTimeFormatInfo

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

Создание экземпляра объекта DateTimeFormatInfo для определенного языка и региональных параметров

Конкретный язык и региональные параметры представляют язык, который говорят в определенной стране или регионе. Например, EN-US — это конкретная культура, представляющая английский язык, произнесенный в США, а en-CA — это конкретная культура, представляющая английский язык, произнесенный в Канаде. Создать экземпляр DateTimeFormatInfo объекта, который представляет соглашения о форматировании для определенного языка и региональных параметров, можно следующими способами.

В следующем примере демонстрируется каждый из этих способов создания экземпляра DateTimeFormatInfo объекта и показывает, доступен ли полученный объект только для чтения.

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
Dim ci As System.Globalization.CultureInfo = Nothing
Dim dtfi As System.Globalization.DateTimeFormatInfo = Nothing

' 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

Создание экземпляра объекта DateTimeFormatInfo для нейтрального языка и региональных параметров

Нейтральный язык и региональные параметры представляют язык и региональные параметры, независимые от страны или региона. Обычно это родительский элемент для одного или нескольких конкретных языков и региональных параметров. Например, fr — это нейтральный язык и региональные параметры для французского языка и родителя языка и региональных параметров fr-FR. Можно создать экземпляр DateTimeFormatInfo объекта, представляющий соглашения о форматировании нейтрального языка и региональных параметров, тем же способом, что и DateTimeFormatInfo объект, представляющий соглашения о форматировании для определенного языка и региональных параметров. Кроме того, можно получить объект нейтральной культуры DateTimeFormatInfo , извлекая нейтральную культуру из свойства конкретного языка и региональных параметров CultureInfo.Parent и получая DateTimeFormatInfo объект, возвращенный его CultureInfo.DateTimeFormat свойством. Если родительский язык и региональные параметры не представляют инвариантный язык и региональные параметры, возвращаемый DateTimeFormatInfo объект доступен для чтения и записи. В следующем примере показаны способы создания экземпляра DateTimeFormatInfo объекта, представляющего нейтральную культуру.

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
 Dim specific, neutral As System.Globalization.CultureInfo
 Dim dtfi As System.Globalization.DateTimeFormatInfo

 ' 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

Примечание

в платформа .NET Framework версии 1,0 до платформа .NET Framework 3,5 попытка получить DateTimeFormatInfo объект, отражающий соглашения о форматировании нейтрального языка и региональных параметров, приводит к NotSupportedException возникновению исключения.

Однако нейтральная культура не имеет сведений о форматировании, связанных с языком и региональными параметрами, так как она не зависит от конкретной страны или региона. вместо того чтобы заполнять DateTimeFormatInfo объект универсальными значениями, платформа .NET Framework возвращает DateTimeFormatInfo объект, отражающий соглашения о форматировании для конкретного языка и региональных параметров, которые являются дочерними для нейтрального языка и региональных параметров. Например, DateTimeFormatInfo объект нейтрального языка и региональных параметров en отражает соглашения о форматировании языка и региональных параметров en-US, а DateTimeFormatInfo объект для языка и региональных параметров fr отражает соглашения о форматировании языка и региональных параметров FR-FR.

Можно использовать код, подобный приведенному ниже, чтобы определить, какие соглашения о форматировании для языка и региональных параметров представляют нейтральный язык и региональные параметры. В примере отражение используется для сравнения DateTimeFormatInfo свойств нейтрального языка и региональных параметров с свойствами определенного дочернего языка и региональных параметров. В этом случае два календаря считаются эквивалентными, если они имеют один и тот же тип календаря, и для григорианского календаря, если их GregorianCalendar.CalendarType свойства имеют одинаковые значения.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;

public class Example
{
   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();
   }
}
Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection

Module Example
   Public Sub Main()
      ' Get all the neutral cultures
      Dim names As New List(Of String)
      Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
                    Sub(culture) names.Add(culture.Name))
      names.Sort()
      For Each name In names
         ' Ignore the invariant culture.
         If name = "" Then Continue For
         
         ListSimilarChildCultures(name)        
      Next
   End Sub

   Private Sub ListSimilarChildCultures(name As String)
      ' Create the neutral DateTimeFormatInfo object.
      Dim dtfi As DateTimeFormatInfo = CultureInfo.GetCultureInfo(name).DateTimeFormat
      ' Retrieve all specific cultures of the neutral culture.
      Dim cultures() As CultureInfo = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures), 
                               Function(culture) culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase))
      ' Create an array of DateTimeFormatInfo properties
      Dim properties() As PropertyInfo = GetType(DateTimeFormatInfo).GetProperties(BindingFlags.Instance Or BindingFlags.Public)
      Dim hasOneMatch As Boolean = False

      For Each ci In cultures
         Dim match As Boolean = True     
         ' Get the DateTimeFormatInfo for a specific culture.
         Dim specificDtfi As DateTimeFormatInfo = ci.DateTimeFormat
         ' Compare the property values of the two.
         For Each prop In properties
            ' We're not interested in the value of IsReadOnly.     
            If prop.Name = "IsReadOnly" Then Continue For
            
            ' For arrays, iterate the individual elements to see if they are the same.
            If prop.PropertyType.IsArray Then 
               Dim nList As IList = CType(prop.GetValue(dtfi, Nothing), IList)
               Dim sList As IList = CType(prop.GetValue(specificDtfi, Nothing), IList)
               If nList.Count <> sList.Count Then
                  match = false
Console.WriteLine("   Different n in {2} array for {0} and {1}", name, ci.Name, prop.Name)
                  Exit For
               End If 

               For ctr As Integer = 0 To nList.Count - 1
                  If Not nList(ctr).Equals(sList(ctr)) 
                     match = false
Console.WriteLine("   {0} value different for {1} and {2}", prop.Name, name, ci.Name)                     
                     Exit For
                  End If     
               Next
               
               If Not match Then Exit For
            ' Get non-array values.
            Else
               Dim specificValue As Object = prop.GetValue(specificDtfi)
               Dim neutralValue As Object = prop.GetValue(dtfi)
                               
               ' Handle comparison of Calendar objects.
               If prop.Name = "Calendar" Then 
                  ' The cultures have a different calendar type.
                  If specificValue.ToString() <> neutralValue.ToString() Then
Console.WriteLine("   Different calendar types for {0} and {1}", name, ci.Name)
                     match = False
                     Exit For
                  End If
                   
                  If TypeOf specificValue Is GregorianCalendar Then
                     If CType(specificValue, GregorianCalendar).CalendarType <> CType(neutralValue, GregorianCalendar).CalendarType Then
Console.WriteLine("   Different Gregorian calendar types for {0} and {1}", name, ci.Name)
                        match = False
                        Exit For
                     End If
                  End If
               Else If Not specificValue.Equals(neutralValue) Then
                  match = false
Console.WriteLine("   Different {0} values for {1} and {2}", prop.Name, name, ci.Name)                  
                  Exit For   
               End If
            End If        
         Next
         If match Then
            Console.WriteLine("DateTimeFormatInfo object for '{0}' matches '{1}'", 
                                      name, ci.Name)
            hasOneMatch = True
         End If                                       
      Next
      If Not hasOneMatch Then
         Console.WriteLine("DateTimeFormatInfo object for '{0}' --> No Match", name)            
      End If
      
      Console.WriteLine()
   End Sub
End Module

Создание экземпляра объекта DateTimeFormatInfo для текущего языка и региональных параметров

Создать экземпляр DateTimeFormatInfo объекта, который представляет соглашения о форматировании для текущего языка и региональных параметров, можно следующими способами.

  • Путем извлечения значения CurrentInfo Свойства. Возвращаемый DateTimeFormatInfo объект доступен только для чтения.

  • Путем получения значения DateTimeFormat свойства из CultureInfo объекта, возвращаемого CultureInfo.CurrentCulture свойством. Возвращаемый DateTimeFormatInfo объект доступен только для чтения.

  • Путем вызова GetInstance метода с CultureInfo объектом, представляющим текущий язык и региональные параметры. Возвращаемый DateTimeFormatInfo объект доступен только для чтения.

В следующем примере каждый из этих методов используется для создания экземпляра DateTimeFormatInfo объекта, представляющего соглашения о форматировании для текущего языка и региональных параметров. Затем он указывает, доступен ли объект только для чтения.

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
Dim dtfi As DateTimeFormatInfo

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

Можно создать доступный для записи DateTimeFormatInfo объект, представляющий соглашения о текущем языке и региональных параметрах, одним из следующих способов:

  • Путем извлечения DateTimeFormatInfo объекта в любом из трех описанных выше способов и вызова Clone метода для возвращенного DateTimeFormatInfo объекта. При этом создается копия исходного DateTimeFormatInfo объекта, за исключением того, что его IsReadOnly свойство имеет значение false .

  • Вызвав CultureInfo.CreateSpecificCulture метод, чтобы создать CultureInfo объект, представляющий текущий язык и региональные параметры, а затем использовать его CultureInfo.DateTimeFormat свойство для получения DateTimeFormatInfo объекта.

В следующем примере демонстрируется каждый способ создания экземпляра объекта, доступного для чтения и записи DateTimeFormatInfo , и отображается значение его IsReadOnly Свойства.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current1 As DateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo
      current1 = CType(current1.Clone(), DateTimeFormatInfo)
      Console.WriteLine(current1.IsReadOnly)

      Dim culture2 As CultureInfo = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name)
      Dim current2 As DateTimeFormatInfo = culture2.DateTimeFormat
      Console.WriteLine(current2.IsReadOnly)
   End Sub
End Module
' The example displays the following output:
'       False
'       False

в Windows пользователь может переопределить некоторые DateTimeFormatInfo значения свойств, используемые в операциях форматирования и анализа, с помощью приложения " язык и региональные стандарты " на панели управления. Например, пользователь, чья культура которого имеет значение Английский (США), может отображать длинные значения времени, используя 24-часовой формат (в формате чч: мм: СС) вместо 12-часового времени по умолчанию (в формате ч: СС TT). DateTimeFormatInfoОбъекты, полученные в описанных выше способах, соответствуют этим переопределениям пользователя. Если это нежелательно, можно создать NumberFormatInfo объект, который не отражает переопределяемые пользователем переопределения (а также доступен для чтения и записи, а не только для чтения), вызвав CultureInfo.CultureInfo(String, Boolean) конструктор и указав значение false для useUserOverride аргумента. Следующий пример иллюстрирует это для системы, текущий язык и региональные параметры которых — английский (США), а длительный шаблон времени был изменен со значения по умолчанию, равного чч: мм: СС.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim culture As CultureInfo
      Dim dtfi As DateTimeFormatInfo
      
      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}", culture.DateTimeFormat.LongTimePattern)
      Console.WriteLine()
            
      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}", culture.DateTimeFormat.LongTimePattern)
   End Sub
End Module
' 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 и динамические данные

Данные, зависящие от языка и региональных параметров, для форматирования значений даты и времени, предоставляемых DateTimeFormatInfo классом, являются динамическими, так же как и культурными данными, предоставляемыми CultureInfo классом. Не следует делать никаких предположений о стабильности значений для DateTimeFormatInfo объектов, связанных с определенными CultureInfo объектами. Стабильными являются только данные, предоставленные инвариантным и связанным с ним DateTimeFormatInfo объектом. Другие данные могут изменяться между сеансами приложения или даже во время работы приложения. Существует четыре основных источника изменений:

  • Обновления системы. Параметры культуры, такие как предпочтительный календарь или настраиваемые форматы даты и времени, изменяются с течением времени. в этом случае Центр обновления Windows включает изменения DateTimeFormatInfo значения свойства для определенного языка и региональных параметров.

  • Языки и региональные параметры замены. CultureAndRegionInfoBuilderКласс можно использовать для замены данных существующего языка и региональных параметров.

  • Каскадные изменения в значениях свойств. Некоторые свойства, связанные с культурой, могут изменяться во время выполнения, что, в свою очередь, приводит к DateTimeFormatInfo изменению данных. Например, текущий язык и региональные параметры можно изменить программно или с помощью действия пользователя. В этом случае объект, DateTimeFormatInfo возвращаемый CurrentInfo свойством, изменяется на объект, связанный с текущим языком и региональными параметрами. Аналогичным образом, календарь языка и региональных параметров может измениться, что может привести к изменениям множества DateTimeFormatInfo значений свойств.

  • Предпочтения пользователя. Пользователи приложения могут переопределить некоторые значения, связанные с текущей культурой системы, с помощью языковых и региональных параметров на панели управления. Например, пользователи могут выбрать отображение даты в другом формате. Если CultureInfo.UseUserOverride свойство имеет значение true , свойства DateTimeFormatInfo объекта также извлекаются из параметров пользователя. Если параметры пользователя несовместимы с культурой, связанной с CultureInfo объектом (например, если выбранный календарь не является одним из календарей, указанных в OptionalCalendars свойстве), результаты методов и значения свойств не определены.

Чтобы максимально сокращать вероятность несоответствия данных, все переопределяемые пользователем свойства DateTimeFormatInfo объекта инициализируются при создании объекта. Существует вероятность несогласованности, так как ни создание объекта, ни процесс переопределения пользователем не являются атомарными, и при создании объекта соответствующие значения могут измениться. Однако такая ситуация должна быть крайне редки.

Вы можете управлять тем, отражают ли пользовательские переопределения в DateTimeFormatInfo объектах, представляющих ту же культуру, что и язык и региональные параметры системы. В следующей таблице перечислены способы DateTimeFormatInfo извлечения объекта и указано, отражают ли результирующий объект переопределения пользователя.

Источник объекта CultureInfo и DateTimeFormatInfo Отражает переопределения, переопределяемые пользователем
СвойствоCultureInfo.CurrentCulture.DateTimeFormat Да
СвойствоDateTimeFormatInfo.CurrentInfo Да
Метод CultureInfo.CreateSpecificCulture Да
Метод CultureInfo.GetCultureInfo Нет
Конструктор CultureInfo.CultureInfo(String) Да
Конструктор CultureInfo.CultureInfo(String, Boolean) Зависит от значения useUserOverride параметра

Если нет достаточной причины для этого, следует учитывать переопределения пользователей при использовании DateTimeFormatInfo объекта в клиентских приложениях для форматирования и синтаксического анализа вводимых пользователем данных или вывода. Для серверных и необслуживаемых приложений нет необходимости. Однако если DateTimeFormatInfo объект явно или неявно используется для сохранения данных даты и времени в виде строки, следует использовать DateTimeFormatInfo объект, отражающий соглашения о форматировании инвариантного языка и региональных параметров, или указать строку настраиваемого формата даты и времени, которая будет использоваться независимо от языка и региональных параметров.

Форматирование даты и времени

DateTimeFormatInfoОбъект используется неявно или явно во всех операциях форматирования даты и времени. К ним относятся вызовы следующих методов:

Все операции форматирования даты и времени используют IFormatProvider реализацию. IFormatProviderИнтерфейс включает один метод, IFormatProvider.GetFormat(Type) . Этому методу обратного вызова передается Type объект, представляющий тип, необходимый для предоставления сведений о форматировании. Метод возвращает либо экземпляр этого типа, либо, null если он не может предоставить экземпляр типа. платформа .NET Framework включает две IFormatProvider реализации для форматирования даты и времени:

  • CultureInfoКласс, представляющий конкретный язык и региональные параметры (или конкретный язык в определенной стране или регионе). В операции форматирования даты и времени CultureInfo.GetFormat метод возвращает DateTimeFormatInfo объект, связанный со CultureInfo.DateTimeFormat свойством.

  • DateTimeFormatInfoКласс, предоставляющий сведения о соглашениях о форматировании соответствующего языка и региональных параметров. DateTimeFormatInfo.GetFormatМетод возвращает экземпляр самого себя.

Если IFormatProvider реализация не предоставляется явно для метода форматирования, CultureInfo используется объект, возвращаемый CultureInfo.CurrentCulture свойством, представляющим текущий язык и региональные параметры.

В следующем примере показана связь между IFormatProvider интерфейсом и DateTimeFormatInfo классом в операциях форматирования. Он определяет пользовательскую IFormatProvider реализацию, GetFormat метод которой отображает тип объекта, запрошенного операцией форматирования. Если запрашивается DateTimeFormatInfo объект, метод предоставляет DateTimeFormatInfo объект для текущего языка и региональных параметров. Как видно из выходных данных в примере, Decimal.ToString(IFormatProvider) метод запрашивает DateTimeFormatInfo объект для предоставления сведений о форматировании, в то время как String.Format(IFormatProvider, String, Object[]) запросы и объекты методов, а NumberFormatInfo DateTimeFormatInfo также ICustomFormatter реализацию.

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 Example
{
   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
Imports System.Globalization

Public Class CurrentCultureFormatProvider : Implements IFormatProvider
   Public Function GetFormat(formatType As Type) As Object _
                   Implements IFormatProvider.GetFormat
      Console.WriteLine("Requesting an object of type {0}", 
                        formatType.Name)
      If formatType Is GetType(NumberFormatInfo) Then
         Return NumberFormatInfo.CurrentInfo
      Else If formatType Is GetType(DateTimeFormatInfo) Then
         Return DateTimeFormatInfo.CurrentInfo
      Else
         Return Nothing
      End If
   End Function
End Class

Module Example
   Public Sub Main()
      Dim dateValue As New Date(2013, 05, 28, 13, 30, 0)
      Dim value As String = dateValue.ToString("F", New CurrentCultureFormatProvider())
      Console.WriteLine(value)
      Console.WriteLine()
      Dim composite As String = String.Format(New CurrentCultureFormatProvider, 
                                              "Date: {0:d}   Amount: {1:C}   Description: {2}",
                                              dateValue, 1264.03d, "Service Charge")
      Console.WriteLine(composite)
      Console.WriteLine()
   End Sub
End Module
' 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

Строки формата и свойства DateTimeFormatInfo

DateTimeFormatInfoОбъект содержит три вида свойств, которые используются в операциях форматирования со значениями даты и времени:

  • Свойства, связанные с календарем. Такие свойства, как AbbreviatedDayNames ,, AbbreviatedMonthNames DayNames и MonthNames , связаны с календарем, используемым языком и региональными параметрами, определяемым Calendar свойством. Эти свойства используются для длинных форматов даты и времени.

  • Свойства, создающие определяемую стандартом строку результатов. RFC1123PatternСвойства, SortableDateTimePattern и UniversalSortableDateTimePattern содержат строки настраиваемого формата, которые создают результирующие строки, определенные международными стандартами. Эти свойства доступны только для чтения и не могут быть изменены.

  • Свойства, определяющие строки результатов с учетом языка и региональных параметров. Некоторые свойства, такие как FullDateTimePattern и ShortDatePattern , содержат строки настраиваемого формата , задающих формат результирующей строки. Другие, такие как AMDesignator , DateSeparator , PMDesignator и TimeSeparator , определяют символы с учетом языка и региональных параметров или подстроки, которые могут быть добавлены в результирующую строку.

Строки стандартных форматов даты и времени, например "d", "d", "f" и "f", являются псевдонимами, соответствующими определенным DateTimeFormatInfo свойствам шаблона формата. Большинство строк настраиваемых форматов даты и времени связаны со строками или подстроками, которые операция форматирования вставляет в результирующий поток. В следующей таблице перечислены описатели стандартных и пользовательских форматов даты и времени, а также связанные с ними DateTimeFormatInfo Свойства. Дополнительные сведения об использовании этих описателей формата см. в разделе строки стандартных форматов даты и времени и строки настраиваемых форматов даты и времени. Обратите внимание, что каждая строка стандартного формата соответствует DateTimeFormatInfo свойству, значение которого является строкой настраиваемого формата даты и времени. Отдельные описатели в этой строке настраиваемого формата, в свою очередь, соответствуют другим DateTimeFormatInfo свойствам. В таблице перечислены только те DateTimeFormatInfo свойства, для которых строки стандартного формата являются псевдонимами, и не перечислены свойства, к которым могут обращаться строки настраиваемого формата, назначенные этим свойствам с псевдонимами. Кроме того, в таблице перечислены только описатели настраиваемого формата, соответствующие DateTimeFormatInfo свойствам.

Описатель формата Связанные свойства
"d" (краткая Дата; строка стандартного формата) ShortDatePattern, чтобы определить общий формат результирующей строки.
"D" (длинный формат даты; строка стандартного формата) LongDatePattern, чтобы определить общий формат результирующей строки.
"f" (полный формат даты и времени; строка стандартного формата) LongDatePattern, чтобы определить формат компонента даты результирующей строки.

ShortTimePattern, чтобы определить формат компонента времени результирующей строки.
"F" (полная дата и длинный формат времени; строка стандартного формата) LongDatePattern, чтобы определить формат компонента даты результирующей строки.

LongTimePattern, чтобы определить формат компонента времени результирующей строки.
"g" (Общая Дата и короткий формат времени; строка стандартного формата) ShortDatePattern, чтобы определить формат компонента даты результирующей строки.

ShortTimePattern, чтобы определить формат компонента времени результирующей строки.
"G" (Общая Дата и длинный формат времени; строка стандартного формата) ShortDatePattern, чтобы определить формат компонента даты результирующей строки.

LongTimePattern, чтобы определить формат компонента времени результирующей строки.
"M", "m" (месяц/день; строка стандартного формата) MonthDayPattern, чтобы определить общий формат результирующей строки.
"O", "o" (Дата и время приема-передачи; строка стандартного формата) Нет.
"R", "r" (RFC1123; строка стандартного формата) RFC1123Pattern, чтобы определить результирующую строку, которая соответствует стандарту RFC 1123. свойство доступно только для чтения.
"s" (Дата и время сортировки; строка стандартного формата) SortableDateTimePattern, чтобы определить результирующую строку, которая соответствует стандарту ISO 8601. свойство доступно только для чтения.
"t" (краткий формат времени; строка стандартного формата) ShortTimePattern, чтобы определить общий формат результирующей строки.
T (длинное время; строка стандартного формата) LongTimePattern, чтобы определить общий формат результирующей строки.
u (универсальная Дата и время для сортировки; строка стандартного формата) UniversalSortableDateTimePattern, чтобы определить результирующую строку, которая соответствует стандарту ISO 8601 для времени в формате UTC. свойство доступно только для чтения.
"U" (универсальная полная дата и время; строка стандартного формата) FullDateTimePattern, чтобы определить общий формат результирующей строки.
"Y", "y" (год месяца; строка стандартного формата) YearMonthPattern, чтобы определить общий формат результирующей строки.
"ddd" (настраиваемый описатель формата) AbbreviatedDayNames, чтобы включить сокращенное название дня недели в результирующую строку.
"g", "GG" (настраиваемый описатель формата) Вызывает GetEraName метод, чтобы вставить имя эры в результирующую строку.
"MMM" (настраиваемый описатель формата) AbbreviatedMonthNames, чтобы включить сокращенное название месяца в результирующую строку.
"MMMM" (настраиваемый описатель формата) MonthNames или MonthGenitiveNames , чтобы включить полное название месяца в результирующую строку.
"t" (настраиваемый описатель формата) AMDesignator или PMDesignator , чтобы включить первый символ указателя AM/PM в результирующую строку.
"TT" (настраиваемый описатель формата) AMDesignator или PMDesignator , чтобы включить в результирующую строку полный указатель AM/PM.
":" (настраиваемый описатель формата) TimeSeparator, чтобы включить в результирующую строку разделитель времени.
"/" (настраиваемый описатель формата) DateSeparator, чтобы включить в результирующую строку разделитель даты.

Изменение свойств DateTimeFormatInfo

Вы можете изменить результирующую строку, созданную строками формата даты и времени, изменив связанные свойства объекта, доступного для записи DateTimeFormatInfo . Чтобы определить DateTimeFormatInfo , доступен ли объект для записи, используйте IsReadOnly свойство. Чтобы настроить DateTimeFormatInfo объект таким образом, выполните следующие действия.

  1. Создайте копию объекта, предназначенного для чтения и записи DateTimeFormatInfo , соглашения о форматировании которого необходимо изменить. (См. раздел Создание экземпляра объекта DateTimeFormatInfo .)

  2. Измените свойство или свойства, которые используются для получения требуемой результирующей строки. (Сведения о том, как методы форматирования используют DateTimeFormatInfo свойства для определения результирующих строк, см. в предыдущем разделе, Формат строк и свойства DateTimeFormatInfo.)

  3. Используйте пользовательский DateTimeFormatInfo объект, созданный в качестве IFormatProvider аргумента в вызовах методов форматирования.

Существует два других способа изменить формат результирующей строки:

  • Класс можно использовать CultureAndRegionInfoBuilder для определения настраиваемого языка и региональных параметров (язык и региональные параметры с уникальным именем, которые дополняют существующие языки и региональные параметры) или заменяющего языка и региональных параметров (используется вместо конкретного языка и региональных параметров). вы можете сохранить и получить доступ к этой культуре программно, как любой CultureInfo объект, поддерживаемый платформа .NET Framework.

  • Если результирующая строка не зависит от языка и региональных параметров и не соответствует стандартному формату, можно использовать строку настраиваемого формата даты и времени. Например, при сериализации данных даты и времени в формате YYYYMMDDHHmmss можно создать результирующую строку, передав в метод строку настраиваемого формата DateTime.ToString(String) , а также преобразовать результирующую строку обратно в DateTime значение, вызвав DateTime.ParseExact метод.

Изменение шаблона короткой даты

В следующем примере изменяется формат результирующей строки, полученной строкой стандартного формата "d" (Краткая дата). Он изменяет связанное ShortDatePattern свойство для языка и региональных параметров en-US или English (США) по умолчанию с "M/d/гггг" на "гггг"-"mm"-"DD" и использует строку стандартного формата "d" для вывода даты как до, так и после ShortDatePattern изменения свойства.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dateValue As New Date(2013, 08, 18) 
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim dtfi As DateTimeFormatInfo = enUS.DateTimeFormat
      
      Console.WriteLine("Before modifying DateTimeFormatInfo object: ")
      Console.WriteLine("{0}: {1}", dtfi.ShortDatePattern, 
                                    dateValue.ToString("d", enUS))
      Console.WriteLine()
      
      ' 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))
   End Sub
End Module
' 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

Изменение символа разделителя даты

В следующем примере символ разделителя даты изменяется в DateTimeFormatInfo объекте, который представляет соглашения о форматировании для языка и региональных параметров fr-FR. В примере используется строка стандартного формата "g" для вывода даты как до, так и после DateSeparator изменения свойства.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dateValue As New Date(2013, 08, 28) 
      Dim frFR As CultureInfo = CultureInfo.CreateSpecificCulture("fr-FR")
      Dim dtfi As DateTimeFormatInfo = 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))
   End Sub
End Module
' 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

Изменение сокращенных названий дней и шаблона полного формата даты

В некоторых случаях шаблон длинной даты, который обычно отображает полное название дня и месяца, а также число дней месяца и года, может быть слишком длинным. В следующем примере сокращен шаблон длинной даты для языка и региональных параметров en-US, который возвращает буквенное сокращение из одного или двух символов, за которым следует номер дня, название месяца и год. Это достигается путем присвоения массиву коротких сокращений названий дней AbbreviatedDayNames и изменения строки настраиваемого формата, назначенной LongDatePattern свойству. Это влияет на результирующие строки, возвращаемые строками стандартного формата "D" и "f".

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim value As New Date(2013, 7, 9)
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim dtfi As DateTimeFormatInfo = enUS.DateTimeFormat
      Dim formats() As String = { "D", "F", "f" }

      ' Display date before modifying properties.
      For Each fmt In formats
         Console.WriteLine("{0}: {1}", fmt, value.ToString(fmt, dtfi))
      Next
      Console.WriteLine()
      
      ' We don't want to change the FullDateTimePattern, so we need to save it.
      Dim originalFullDateTimePattern As String = dtfi.FullDateTimePattern
      
      ' Modify day name abbreviations and long date pattern.
      dtfi.AbbreviatedDayNames = { "Su", "M", "Tu", "W", "Th", "F", "Sa" }
      dtfi.LongDatePattern = "ddd dd-MMM-yyyy"
      dtfi.FullDateTimePattern = originalFullDateTimePattern
      For Each fmt In formats
         Console.WriteLine("{0}: {1}", fmt, value.ToString(fmt, dtfi))
      Next
   End Sub
End Module
' 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

Обычно изменение LongDatePattern свойства также влияет на FullDateTimePattern свойство, которое, в свою очередь, определяет результирующую строку, возвращаемую строкой стандартного формата "F". Чтобы сохранить исходный полный шаблон даты и времени, в примере переназначается исходная строка настраиваемого формата, назначенная FullDateTimePattern свойству после LongDatePattern изменения свойства.

Переход с 12-часового времени на 24-часовой формат

для многих языков и региональных параметров в платформа .NET Framework время выражается с помощью 12-часового времени и указателя AM/PM. В следующем примере определяется ReplaceWith24HourClock метод, который заменяет любой формат времени, в котором используется 12-часовое время с форматом, использующим 24-часовое время.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   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
Imports System.Globalization
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim dtfi As DateTimeFormatInfo = 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)
   End Sub
   
   Private Function ReplaceWith24HourClock(fmt As String) As String
      Dim pattern As String = "^(?<openAMPM>\s*t+\s*)? " +
                              "(?(openAMPM) h+(?<nonHours>[^ht]+)$ " +
                              "| \s*h+(?<nonHours>[^ht]+)\s*t+)"
      Return Regex.Replace(fmt, pattern, "HH${nonHours}", RegexOptions.IgnorePatternWhitespace)   
   End Function
End Module
' 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

В примере используется регулярное выражение для изменения строки формата. Шаблон регулярного выражения @"^(?<openAMPM>\s*t+\s*)? (?(openAMPM) h+(?<nonHours>[^ht]+)$ | \s*h+(?<nonHours>[^ht]+)\s*t+) определяется следующим образом:

Шаблон Описание
^ Начало совпадения в начале строки.
(?<openAMPM>\s*t+\s*)? Совпадение с нулевым или одним вхождением нуля или более символов пробела, за которым следует буква "t" один или несколько раз, за которыми следует ноль или больше символов пробела. Эта группа записи называется openAMPM .
(?(openAMPM) h+(?<nonHours>[^ht]+)$ Если openAMPM Группа имеет совпадение, сопоставьте букву "h" один или несколько раз, за которыми следует один или несколько символов, не являющихся "h" или "t". Совпадение заканчивается в конце строки. Все символы, захваченные после "h", включены в группу записи с именем nonHours .
&#124; \s*h+(?<nonHours>[^ht]+)\s*t+) Если в openAMPM группе не найдено совпадений, сопоставьте букву "h" один или несколько раз, за которыми следует один или несколько символов, не являющихся "h" или "t", за которыми следует ноль или больше символов пробела. Наконец, сопоставьте одно или несколько вхождений буквы «t». Все символы, захваченные после "h" и перед пробелами и "t", включаются в группу записи с именем nonHours .

nonHoursГруппа записи содержит минуты и, возможно, второй компонент настраиваемой строки формата даты и времени, а также все символы разделителя времени. Шаблон замены HH${nonHours} добавляет к этим элементам подстроку "HH".

Отображение и изменение эры в дате

В следующем примере настраиваемый описатель формата "g" добавляется к LongDatePattern свойству объекта, представляющего соглашения о форматировании для языка и региональных параметров en-US. Это добавление влияет на следующие три строки стандартного формата:

  • Строка стандартного формата "D" (длинная Дата), которая сопоставляется непосредственно со LongDatePattern свойством.

  • Строка стандартного формата "f" (полная дата и короткий формат времени), которая создает результирующую строку, объединяющую подстроки, созданные LongDatePattern ShortTimePattern свойствами и.

  • Строка стандартного формата "F" (полная дата и длинное время), которая напрямую сопоставляется FullDateTimePattern свойству. Поскольку значение этого свойства не задано явным образом, оно создается динамически путем сцепления LongDatePattern LongTimePattern свойств и.

В примере также показано, как изменить название эры для языка и региональных параметров, чей календарь имеет одну эру. В этом случае в языке и региональных параметрах en-US используется григорианский календарь, представленный GregorianCalendar объектом. GregorianCalendarКласс поддерживает одну эру, имя которой — н.э.. (Анно Домини). В примере имя эры изменяется на Н.Э. (Общая эра) замена настраиваемого описателя формата "g" в строке формата, назначенной FullDateTimePattern свойству строкой литерала. необходимо использовать литеральную строку, так как имя эры обычно возвращается GetEraName методом из личных данных в таблицах языка и региональных параметров, предоставляемых либо платформа .NET Framework, либо Windows операционной системы.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dateValue As New Date(2013, 5, 18, 13, 30, 0)
      Dim formats() As String = { "D", "f", "F" }      
      
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim dtfi As DateTimeFormatInfo = enUS.DateTimeFormat
      Dim originalLongDatePattern As String = dtfi.LongDatePattern

      ' Display the default form of three long date formats.
      For Each fmt In formats
         Console.WriteLine(dateValue.ToString(fmt, dtfi))
      Next
      Console.WriteLine()
      
      ' Modify the long date pattern.
      dtfi.LongDatePattern = originalLongDatePattern + " g"
      For Each fmt In formats
         Console.WriteLine(dateValue.ToString(fmt, dtfi))
      Next
      Console.WriteLine()
      
      ' Change A.D. to C.E. (for Common Era)
      dtfi.LongDatePattern = originalLongDatePattern + " 'C.E.'"
      For Each fmt In formats
         Console.WriteLine(dateValue.ToString(fmt, dtfi))
      Next
   End Sub
End Module
' 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

Анализ строк даты и времени

Анализ предполагает преобразование строкового представления даты и времени в DateTime DateTimeOffset значение или. Оба этих типа включают Parse TryParse методы,, ParseExact и TryParseExact для поддержки операций синтаксического анализа. ParseМетоды и TryParse преобразуют строку, которая может иметь различные форматы, в то время как ParseExact и TryParseExact требует, чтобы строка имела определенный формат или форматы. Значение, если операция синтаксического анализа завершается неудачно Parse и ParseExact вызывает исключение, в то время как TryParse и TryParseExact возвращает false .

Методы синтаксического анализа неявно или явно используют DateTimeStyles значение перечисления для определения того, какие элементы стиля (например, ведущие, завершающие или внутренние пробелы) могут присутствовать в строке для анализа, и как интерпретировать проанализированную строку или любые отсутствующие элементы. Если не указать DateTimeStyles значение при вызове Parse TryParse метода или, по умолчанию используется, то DateTimeStyles.AllowWhiteSpaces есть составной стиль, включающий DateTimeStyles.AllowLeadingWhite DateTimeStyles.AllowTrailingWhite DateTimeStyles.AllowInnerWhite Флаги, и. Для ParseExact методов и значение TryParseExact по умолчанию — DateTimeStyles.None ; входная строка должна точно соответствовать определенной строке настраиваемого формата даты и времени.

Методы анализа также неявно или явно используют DateTimeFormatInfo объект, который определяет конкретные символы и шаблоны, которые могут возникать в анализируемой строке. Если объект не предоставлен DateTimeFormatInfo , DateTimeFormatInfo по умолчанию используется объект для текущего языка и региональных параметров. Дополнительные сведения о синтаксическом анализе строк даты и времени см. в описании отдельных методов синтаксического анализа, таких как DateTime.Parse ,, DateTime.TryParse DateTimeOffset.ParseExact и DateTimeOffset.TryParseExact .

В следующем примере показана структура синтаксического анализа строк даты и времени с учетом языка и региональных параметров. Он пытается выполнить синтаксический анализ двух строк даты с использованием правил языка и региональных параметров en-US, EN-GB, fr-FR и Fi-FI. Дата, интерпретируемая как 8/18/2014 в культуре en-US, вызывает FormatException исключение в других трех культурах, поскольку 18 интерпретируется как номер месяца. 1/2/2015 анализируется как второй день первого месяца в культуре en-US, но как первый день второго месяца в остальных культурах.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dateStrings() As String = { "08/18/2014", "01/02/2015" }
      Dim cultureNames() As String = { "en-US", "en-GB", "fr-FR", "fi-FI" }
      
      For Each cultureName In cultureNames
         Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("Parsing strings using the {0} culture.", 
                           culture.Name)
         For Each dateStr In dateStrings
            Try
               Console.WriteLine(String.Format(culture, 
                                 "   '{0}' --> {1:D}", dateStr, 
                                 DateTime.Parse(dateStr, culture)))
            Catch e As FormatException
               Console.WriteLine("   Unable to parse '{0}'", dateStr)
            End Try
         Next
      Next
   End Sub
End Module
' 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

Строки даты и времени обычно анализируются по двум причинам:

  • Для преобразования вводимых пользователем данных в значение даты и времени.

  • Для округления значения даты и времени; то есть для десериализации значения даты и времени, которое было ранее сериализовано в виде строки.

В следующих разделах эти две операции рассматриваются более подробно.

Анализ пользовательских строк

При синтаксическом анализе строк даты и времени, вводимых пользователем, всегда следует создавать экземпляр DateTimeFormatInfo объекта, отражающий региональные параметры пользователя, включая любые настройки, которые могли быть сделаны пользователем. В противном случае объект даты и времени может иметь неверные значения. Сведения о том, как создать экземпляр DateTimeFormatInfo объекта, отражающего пользовательские настройки культуры, см. в разделе DateTimeFormatInfo и Dynamic Data .

В следующем примере показана разница между операцией синтаксического анализа, которая отражает региональные параметры пользователя, а другая — нет. В этом случае языком по умолчанию является en-US, но пользователь использовал панель управления, регион и язык , чтобы изменить шаблон краткой даты с "M/d/гггг" на "гг/мм/дд". Когда пользователь вводит строку, отражающую пользовательские параметры, и строка анализируется DateTimeFormatInfo объектом, который также отражает пользовательские параметры (переопределения), операция анализа возвращает правильный результат. Однако если строка анализируется DateTimeFormatInfo объектом, который отражает стандартные региональные параметры en-US, метод анализа создает FormatException исключение, поскольку оно интерпретирует 14 как число месяца, а не последние две цифры года.

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim inputDate As String = "14/05/10"
      
      Dim cultures() As CultureInfo = { CultureInfo.GetCultureInfo("en-US"), 
                                        CultureInfo.CreateSpecificCulture("en-US") }
      
      For Each culture In cultures
         Try
            Console.WriteLine("{0} culture reflects user overrides: {1}", 
                              culture.Name, culture.UseUserOverride)
            Dim occasion As DateTime = DateTime.Parse(inputDate, culture)
            Console.WriteLine("'{0}' --> {1}", inputDate, 
                              occasion.ToString("D", CultureInfo.InvariantCulture))
         Catch e As FormatException
            Console.WriteLine("Unable to parse '{0}'", inputDate)                           
         End Try   
         Console.WriteLine()  
      Next
   End Sub
End Module
' 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

Сериализация и десериализация данных даты и времени

Сериализованные данные даты и времени ожидаются с циклическим обменом; то есть все сериализованные и десериализованные значения должны быть идентичными. Если значение даты и времени представляет один момент времени, десериализованное значение должно представлять тот же момент времени независимо от языка и региональных параметров или часового пояса системы, в которой он был восстановлен. Для успешного приема данных даты и времени необходимо использовать соглашения инвариантного языка и региональных параметров, возвращаемых InvariantInfo свойством для создания и анализа данных. Операции форматирования и анализа никогда не должны отражать соглашения о культуре по умолчанию. При использовании региональных параметров по умолчанию переносимость данных строго ограничена; его можно успешно десериализовать только в потоке, параметры культуры которого идентичны параметрам потока, в котором он был сериализован. В некоторых случаях это означает, что данные не могут быть даже успешно сериализованы и десериализованы в одной системе.

Если компонент времени значения даты и времени важен, его также следует преобразовать в формат UTC и сериализовать с помощью строки стандартного формата"o" или "r". Затем данные времени можно восстановить, вызвав метод синтаксического анализа и передав ему соответствующую строку формата вместе с инвариантным языком и региональными параметрами в качестве provider аргумента.

В следующем примере показан процесс обработки значения даты и времени в цикле. Она сериализует дату и время в системе, которая наблюдает за тихоокеанское время США, а текущий язык и региональные параметры — en-US.

using System;
using System.Globalization;
using System.IO;

public class Example
{
   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)
Imports System.Globalization
Imports System.IO

Module Example
   Public Sub Main()
      Dim sw As New StreamWriter(".\DateData.dat")
      ' Define a date and time to serialize.
      Dim originalDate As New Date(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.
      Dim utcDate As Date = originalDate.ToUniversalTime()
      ' Serialize the UTC value.
      sw.Write(utcDate.ToString("o", DateTimeFormatInfo.InvariantInfo))
      sw.Close()
   End Sub
End Module
' 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)

Он десериализует данные в системе в часовом поясе Брюссель, Копенгаген, Мадрид и Париж, а текущий язык и региональные параметры — fr-FR. Дата восстановления составляет девять часов позже, чем исходная дата, что отражает настройку часового пояса от восьми часов после UTC до времени в формате UTC до 1 часа. Как исходная дата, так и дата восстановления представляют один и тот же момент времени.

using System;
using System.Globalization;
using System.IO;

public class Example
{
   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
Imports System.Globalization
Imports System.IO

Module Example
   Public Sub Main()
      ' Open the file and retrieve the date string.
      Dim sr As New StreamReader(".\DateData.dat")             
      Dim dateValue As String = sr.ReadToEnd()
      
      ' Parse the date.
      Dim parsedDate As Date = Date.ParseExact(dateValue, "o", 
                               DateTimeFormatInfo.InvariantInfo)
      ' Convert it to local time.                             
      Dim restoredDate As Date = 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)
   End Sub
End Module
' 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

Конструкторы

DateTimeFormatInfo()

Инициализирует новый доступный для записи экземпляр класса DateTimeFormatInfo, не зависящий от языка и региональных параметров (инвариантный).

Свойства

AbbreviatedDayNames

Возвращает или задает одномерный массив типа String, содержащий сокращения дней недели, принятые в определенном языке и региональных параметрах.

AbbreviatedMonthGenitiveNames

Возвращает или задает массив строк сокращенных названий месяцев, связанных с текущим объектом DateTimeFormatInfo.

AbbreviatedMonthNames

Получает или задает одномерный строковый массив, содержащий сокращения месяцев, принятые в определенном языке и региональных параметрах.

AMDesignator

Возвращает или задает строку указателя часов до полудня (АМ — "ante meridiem").

Calendar

Возвращает или задает календарь, используемый в текущей языке и региональных параметрах.

CalendarWeekRule

Возвращает или задает значение, определяющее правило, используемое для определения первой календарной недели года.

CurrentInfo

Получает доступный только для чтения объект DateTimeFormatInfo, форматирующий значения на основе текущего языка и региональных параметров.

DateSeparator

Возвращает или задает строку, разделяющую компоненты даты — год, месяц и день.

DayNames

Получает или задает одномерный массив строк, содержащий полные названия дней недели, принятые в определенном языке и региональных параметрах.

FirstDayOfWeek

Возвращает или задает первый день недели.

FullDateTimePattern

Получает или задает строку пользовательского формата для длинного значения даты и длинного значения времени.

InvariantInfo

Получает доступный только для чтения объект по умолчанию DateTimeFormatInfo, который не зависит от языка и региональных параметров (инвариантный).

IsReadOnly

Получает значение, показывающее, является ли объект DateTimeFormatInfo доступным только для чтения.

LongDatePattern

Получает или задает строку пользовательского формата для длинного значения даты.

LongTimePattern

Получает или задает строку пользовательского формата для длинного значения времени.

MonthDayPattern

Получает или задает строку пользовательского формата для значения месяца и дня.

MonthGenitiveNames

Возвращает или задает массив строк имен месяцев, связанных с текущим объектом DateTimeFormatInfo.

MonthNames

Возвращает или задает одномерный массив типа String, содержащий полные названия месяцев, принятые в определенном языке и региональных параметрах.

NativeCalendarName

Получает собственное имя календаря, связанного с текущим объектом DateTimeFormatInfo object.

PMDesignator

Возвращает или задает строку указателя часов после полудня (PМ — "post meridiem").

RFC1123Pattern

Получает строку пользовательского формата для значения времени, основанного на спецификации IETF Request for Comments 1123 (RFC IETF).

ShortDatePattern

Получает или задает строку пользовательского формата для короткого значения даты.

ShortestDayNames

Возвращает или задает массив строк самых кратких уникальных сокращений имен дней, связанный с текущим объектом DateTimeFormatInfo.

ShortTimePattern

Получает или задает строку пользовательского формата для короткого значения времени.

SortableDateTimePattern

Получает строку пользовательского формата для сортируемого значения даты и времени.

TimeSeparator

Возвращает или задает строку, разделяющую компоненты времени — час, минуты и секунды.

UniversalSortableDateTimePattern

Получает строку пользовательского формата для универсальной, сортируемой строки даты и времени в соответствии со стандартом ISO 8601.

YearMonthPattern

Получает или задает строку пользовательского формата для значения года и месяца.

Методы

Clone()

Создает неполную копию DateTimeFormatInfo.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetAbbreviatedDayName(DayOfWeek)

Возвращает полное название указанного дня недели, принятое в определенном языке и региональных параметрах, связанных с текущим объектом DateTimeFormatInfo.

GetAbbreviatedEraName(Int32)

Возвращает строку, содержащую сокращенное название указанной эры, если такое сокращение существует.

GetAbbreviatedMonthName(Int32)

Возвращает сокращение указанного месяца, принятое в определенном языке и региональных параметрах, связанных с текущим объектом DateTimeFormatInfo.

GetAllDateTimePatterns()

Возвращает все стандартные шаблоны, в которых можно форматировать значения даты и времени.

GetAllDateTimePatterns(Char)

Возвращает все шаблоны, в которых значения даты и времени можно форматировать с использованием заданной стандартной строки формата.

GetDayName(DayOfWeek)

Возвращает сокращение указанного дня недели, принятое в определенном языке и региональных параметрах, связанных с текущим объектом DateTimeFormatInfo.

GetEra(String)

Возвращает целое число, представляющее собой указанную эру.

GetEraName(Int32)

Возвращает строку, содержащую название указанной эры.

GetFormat(Type)

Возвращает объект указанного типа, предоставляющий службу форматирования времени и даты.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetInstance(IFormatProvider)

Возвращает объект DateTimeFormatInfo, связанный с указанным IFormatProvider.

GetMonthName(Int32)

Возвращает полное имя указанного месяца, принятое в определенном языке и региональных параметрах, связанных с текущим объектом DateTimeFormatInfo.

GetShortestDayName(DayOfWeek)

Получает самое короткое сокращенное название дня для определенного дня недели, связанное с текущим объектом DateTimeFormatInfo.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ReadOnly(DateTimeFormatInfo)

Возвращает программу-оболочку DateTimeFormatInfo, доступную только для чтения.

SetAllDateTimePatterns(String[], Char)

Задает строки пользовательского формата даты и времени, соответствующие заданной стандартной строке формата.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Явные реализации интерфейса

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Заполняет объект SerializationInfo данными, необходимыми для сериализации целевого объекта.

Применяется к

См. также раздел