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 класса содержат сведения, относящиеся к языку и региональным параметрам, для форматирования или синтаксического анализа значений даты и времени, таких как:

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

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

  • Имена дней недели.

  • Имена месяцев года.

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

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

Содержание

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

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

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

Инвариантная культура представляет язык и региональные параметры, не зависящие от языка и региональных параметров. Он основан на английском языке, но не на какой-либо конкретной англоязычной стране или регионе. Хотя данные конкретных языков и региональных параметров могут быть динамическими и могут изменяться в соответствии с новыми культурными соглашениями или предпочтениями пользователей, данные инвариантного языка и региональных параметров не изменяются. Можно создать экземпляр 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 значения свойств, используемые в операциях форматирования и синтаксического анализа с помощью приложения Region и Language в панель управления. Например, пользователь, язык и региональные параметры которого — английский (США), могут отображать длинные значения времени с помощью 24-часовых часов (в формате ЧЧ:мм:сс) вместо 12-часовых часов (в формате h:mm:ss tt). Объекты DateTimeFormatInfo , полученные ранее, отражают переопределения этих пользователей. Если это нежелательно, можно создать NumberFormatInfo объект, который не отражает переопределения пользователей (а также чтение и запись вместо только для чтения), вызвав CultureInfo.CultureInfo(String, Boolean) конструктор и указав значение false для аргумента useUserOverride . В следующем примере показано это для системы, язык и региональные параметры которой имеют английский язык (США) и долговременный шаблон которого был изменен с значения по умолчанию h:mm:ss tt на HH:mm:ss.

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 . Эти свойства используются для длинных форматов даты и времени.

  • Свойства, создающие строку результатов, определяемую стандартами. SortableDateTimePatternСвойства RFC1123Patternи 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 для согласованного универсального времени. свойство доступно только для чтения.
"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.

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

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

В следующем примере изменяется формат строки результата, созданной строкой стандартного формата "d" (short date). Он изменяет связанное ShortDatePattern свойство для языка и региональных параметров en-US или английского языка (США) с значения по умолчанию "M/d/yyyy" на "y'-"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" (long date), которая сопоставляется непосредственно со свойством LongDatePattern .

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

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

В примере также показано, как изменить имя эпохи для культуры, календарь которой имеет одну эру. В этом случае язык и региональные параметры en-US используют григорианский календарь, который представлен GregorianCalendar объектом. Класс GregorianCalendar поддерживает одну эру, которая называется A.D. (Anno Domini). В примере изменяется имя эры на C.E. (Common Era) заменив описатель настраиваемого формата 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 значение перечисления, чтобы определить, какие элементы стиля (например, начальный, конечный или внутренний пробел) могут присутствовать в строке для синтаксического анализа и как интерпретировать проанализированную строку или любые отсутствующие элементы. Если при вызове Parse или методе не указано DateTimeStyles значение, по умолчанию используется DateTimeStyles.AllowWhiteSpacesсоставной стиль, включающий DateTimeStyles.AllowLeadingWhiteDateTimeStyles.AllowTrailingWhiteфлаги и DateTimeStyles.AllowInnerWhite т. TryParse д. ParseExact Для и TryParseExact методов используется DateTimeStyles.Noneзначение по умолчанию. Входная строка должна точно соответствовать определенной пользовательской строке формата даты и времени.

Методы синтаксического анализа также неявно или явно используют DateTimeFormatInfo объект, определяющий конкретные символы и шаблоны, которые могут возникнуть в строке для анализа. Если объект не указан DateTimeFormatInfo , DateTimeFormatInfo по умолчанию используется объект для текущего языка и региональных параметров. Дополнительные сведения о синтаксическом анализе строк даты и времени см. в отдельных методах синтаксического анализа, таких как DateTime.Parse, , DateTime.TryParseDateTimeOffset.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 и динамических данных .

В следующем примере показано различие между операцией синтаксического анализа, которая отражает региональные параметры пользователя и ту, которая не используется. В этом случае системный язык и региональные параметры по умолчанию — en-US, но пользователь использовал панель управления, регион и язык для изменения шаблона короткой даты с значения по умолчанию "M/d/yyyy" на "yy/MM/dd". Когда пользователь вводит строку, которая отражает параметры пользователя, и строка анализируется 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. Исходная и восстановленная дата представляют один и тот же момент времени.

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 данными, необходимыми для сериализации целевого объекта.

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

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