Использование календарей для определенных языков и региональных параметров

Обновлен: Ноябрь 2007

Глобализованные приложения должны быть способны отображать и использовать календари, основанные на текущем языке и региональных параметрах. Платформа .NET Framework предоставляет класс Calendar, а также следующие реализации класса:

Класс CultureInfo содержит свойство Calendar, которое определяет календарь по умолчанию для языка и региональных параметров. Для некоторых языков и региональных параметров предусмотрена поддержка нескольких календарей. Свойство OptionalCalendars определяет дополнительные календари, которые поддерживаются для выбранного языка и региональных параметров.

В приведенном ниже примере кода создаются объекты CultureInfo для языков и региональных параметров "Тайский (Таиланд)" ("th-TH") и "Японский (Япония)" ("ja-JP"). В примере отображены календари по умолчанию и дополнительные календари для каждого языка и региональных параметров. Необходимо помнить, что объект GregorianCalendar делится на подтипы. Свойство CalendarType определяет подтип григорианского календаря. В этом примере каждый раз, когда календарь определен как григорианский, вычисляется и выводится на экран значение CalendarType. Список возможных значений свойства CalendarType и пояснения см. в описании GregorianCalendarTypes.

Imports System
Imports System.Globalization
Imports Microsoft.VisualBasic

Public Class TestClass   
   
   Public Shared Sub Main()
      ' Creates a CultureInfo for Thai in Thailand.
      Dim th As New CultureInfo("th-TH")
      DisplayCalendars(th)

      ' Creates a CultureInfo for Japanese in Japan.
      Dim ja As New CultureInfo("ja-JP")
      DisplayCalendars(ja)
   End Sub

   Protected Shared Sub DisplayCalendars(cultureinfo As CultureInfo)
      Dim ci As New CultureInfo(cultureinfo.ToString())
      
      ' Displays the default calendar for the culture.
      If TypeOf ci.Calendar Is GregorianCalendar Then
         Console.WriteLine(ControlChars.Newline + ControlChars.Newline + _
         "The default calendar for the {0} culture is:" + _
         ControlChars.Newline + " {1}" + ControlChars.Newline + _
         ControlChars.Newline, ci.DisplayName.ToString(), _
         ci.Calendar.ToString() + " subtype" + CType(ci.Calendar, _
         GregorianCalendar).CalendarType.ToString())
      Else
         Console.WriteLine(ControlChars.Newline + ControlChars.Newline + _
            "The default calendar for the {0} culture is:" + _
            ControlChars.Newline + "{1}" + ControlChars.Newline + _
            ControlChars.Newline, ci.DisplayName.ToString(),_
            ci.Calendar.ToString())
      End If
      
      ' Displays the optional calendars for the culture.
      Console.WriteLine("The optional calendars for the {0} culture are: _
         ", ci.DisplayName.ToString())
      Dim i As Integer
      For i = ci.OptionalCalendars.GetLowerBound(0) To _
         ci.OptionalCalendars.GetUpperBound(0)

         If TypeOf ci.OptionalCalendars(i) Is GregorianCalendar Then
            ' Displays the calendar subtype.
            Dim CalStr As [String] = ci.OptionalCalendars(i).ToString() _
               + " subtype " + CType(ci.OptionalCalendars(i), _
               GregorianCalendar).CalendarType.ToString()
            Console.WriteLine(CalStr)
         Else
            Console.WriteLine(ci.OptionalCalendars(i).ToString())
         End If
      Next i 
   End Sub
End Class
using System;
using System.Globalization;

public class TestClass
{
   public static void Main()
   {
      // Creates a CultureInfo for Thai in Thailand.
      CultureInfo th= new CultureInfo("th-TH");
      DisplayCalendars(th);
      
      // Creates a CultureInfo for Japanese in Japan.
      CultureInfo ja= new CultureInfo("ja-JP");
      DisplayCalendars(ja);
      
   }

   protected static void DisplayCalendars(CultureInfo cultureinfo)
   {
      CultureInfo ci = new CultureInfo(cultureinfo.ToString());
      
      // Displays the default calendar for the culture.
      if (ci.Calendar is GregorianCalendar)   
         Console.WriteLine ("\n\nThe default calendar for the {0} culture 
            is:\n {1}\n\n", ci.DisplayName.ToString(), 
            ci.Calendar.ToString() + " subtype " + 
            ((GregorianCalendar)ci.Calendar).CalendarType.ToString());
      else
         Console.WriteLine ("\n\nThe default calendar for the {0} culture 
            is: \n{1}\n\n", ci.DisplayName.ToString(), 
            ci.Calendar.ToString());

      // Displays the optional calendars for the culture.
      Console.WriteLine ("The optional calendars for the {0} culture are: 
         ", ci.DisplayName.ToString());
         for (int i = ci.OptionalCalendars.GetLowerBound(0); i <= 
               ci.OptionalCalendars.GetUpperBound(0); i++ )
         {
            if (ci.OptionalCalendars[i] is GregorianCalendar)
            {
               // Displays the calendar subtype.
               String CalStr = (ci.OptionalCalendars[i].ToString() + " 
                  subtype " + ((GregorianCalendar)ci.OptionalCalendars[i]).CalendarType.ToString());
               Console.WriteLine(CalStr);
            }
            else 
               Console.WriteLine (ci.OptionalCalendars[i].ToString());
         }
   }
}

В результате выполнения кода получены следующие выходные данные:

The default calendar for the Thai (Thailand) culture is: 
System.Globalization.ThaiBuddhistCalendar

The optional calendars for the Thai (Thailand) culture are: 
System.Globalization.ThaiBuddhistCalendar
System.Globalization.GregorianCalendar subtype Localized

The default calendar for the Japanese (Japan) culture is:
System.Globalization.GregorianCalendar subtype Localized

The optional calendars for the Japanese (Japan) culture are: 
System.Globalization.JapaneseCalendar
System.Globalization.GregorianCalendar subtype USEnglish
System.Globalization.GregorianCalendar subtype Localized

Следующий пример кода иллюстрирует, как похожие методы структуры DateTime и класса Calendar могут возвращать различные результаты для одного и того же языка и региональных параметров. Свойству CurrentCulture для потока присвоено значение "he-IL" (иврит — Израиль), а в качестве текущего календаря задан еврейский. Создан и инициализирован тип DateTime. Затем члены структуры DateTime и класса Calendar используются для возврата дня, месяца, года и количества месяцев в году, и эти значения выводятся на экран. Только методы класса Calendar возвращают день, месяц, год и количество месяцев в году на основании еврейского календаря. В методах структуры DateTime для вычислений всегда используется григорианский календарь независимо от текущего календаря.

Imports System
Imports System.Threading
Imports System.Globalization
Imports Microsoft.VisualBasic

Public Class TestClass

   Public Shared Sub Main()
      ' Creates a CultureInfo for Hebrew in Israel.
      Dim he As New CultureInfo("he-IL")
      he.DateTimeFormat.Calendar = New HebrewCalendar()
      Console.WriteLine(ControlChars.Newline + ControlChars.Newline _
         + "The current calendar set for the {0} culture is:" + _
         ControlChars.Newline + " {1}", he.DisplayName.ToString(), _
         he.DateTimeFormat.Calendar.ToString())
      Dim dt As New DateTime(5760, 11, 4, he.DateTimeFormat.Calendar)
      Console.WriteLine(ControlChars.Newline + " The DateTime _
         returns the day as: {0}", dt.Day)
      Console.WriteLine(ControlChars.Newline + " The Calendar class _
         returns the day as: {0}", _
         he.DateTimeFormat.Calendar.GetDayOfMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The DateTime _
         returns the month as: {0}", dt.Month)
      Console.WriteLine(ControlChars.Newline + " The Calendar class _
         returns the month as: {0}", _
         he.DateTimeFormat.Calendar.GetMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The DateTime _
         returns the Year as: {0}", dt.Year)
      Console.WriteLine(ControlChars.Newline + " The Calendar class _
         returns the Year as: {0}", _
         he.DateTimeFormat.Calendar.GetYear(dt))
      Console.WriteLine(ControlChars.Newline + " The Calendar class _
         returns the number of months in the year {0} as: {1}", _
         he.DateTimeFormat.Calendar.GetYear(dt), _
         he.DateTimeFormat.Calendar.GetMonthsInYear _
        (he.DateTimeFormat.Calendar.GetYear(dt))
      Console.WriteLine(ControlChars.Newline + " The DateTime does _
         not return the number of months in a year " + _
         ControlChars.Newline + " because it uses the Gregorian _
         calendar, which always has twelve months.")
   End Sub
End Class
using System;
using System.Threading;
using System.Globalization;

public class TestClass
{
   public static void Main()
   {
      // Creates a CultureInfo for Hebrew in Israel.
      CultureInfo he= new CultureInfo("he-IL");
      Thread.CurrentThread.CurrentCulture = he;
      he.DateTimeFormat.Calendar = new HebrewCalendar();
      Console.WriteLine ("\n\nThe current calendar set for the {0} culture 
         is:\n {1}", he.DisplayName.ToString(), 
         he.DateTimeFormat.Calendar.ToString());
      DateTime dt = new DateTime(5760, 11, 4, he.DateTimeFormat.Calendar);
      Console.WriteLine ("\nThe DateTime returns the day as: {0}", 
            dt.Day);
      Console.WriteLine ("\nThe Calendar class returns the day as: {0}", 
            he.DateTimeFormat.Calendar.GetDayOfMonth(dt));
      Console.WriteLine ("\nThe DateTime returns the month as: 
            {0}", dt.Month);
      Console.WriteLine ("\nThe Calendar class returns the month as: 
            {0}", he.DateTimeFormat.Calendar.GetMonth(dt));
      Console.WriteLine ("\nThe DateTime returns the year as: {0}", 
            dt.Year);
      Console.WriteLine ("\nThe Calendar class returns the year as: {0}", 
            he.DateTimeFormat.Calendar.GetYear(dt));      
      Console.WriteLine ("\nThe Calendar class returns the number of 
            months in the year {0} as: 
            {1}",he.DateTimeFormat.Calendar.GetYear(dt), 
            he.DateTimeFormat.Calendar.GetMonthsInYear
            (he.DateTimeFormat.Calendar.GetYear(dt)));
      Console.WriteLine ("\nThe DateTime does not return the number 
            of months in a year \nbecause it uses the Gregorian calendar, 
            which always has twelve months.");
   }
}

В результате выполнения кода получены следующие выходные данные:

The current calendar set for the Hebrew (Israel) culture is:
 System.Globalization.HebrewCalendar

The DateTime returns the day as: 7

The Calendar class returns the day as: 4

The DateTime returns the month as: 7

The Calendar class returns the month as: 11

The DateTime returns the year as: 2000

The Calendar class returns the year as: 5760

The Calendar class returns the number of months in the year 5760 as: 13

The DateTime does not return the number of months in a year 
because it uses the Gregorian calendar, which always has twelve months.

Следующий пример кода показывает, как возвращаемые значения для текущего месяца, дня и года могут отличаться в зависимости от текущего календаря, установленного для конкретного языка и региональных параметров. Свойству CurrentCulture для потока присвоено значение "ja-JP", при этом в качестве календаря задан JapaneseCalendar. Возвращаемые значения дня, месяца и года отображаются на экране. Затем в качестве календаря выбирается GregorianCalendarи на экран выводятся возвращаемые значения дня, месяца и года. Следует обратить внимание на разные значения года в зависимости от текущего календаря. Для японского календаря это 13-й год, в то время как для григорианского — 2001-й год.

Imports System
Imports System.Threading
Imports System.Globalization
Imports Microsoft.VisualBasic 

Public Class TestClass   
   
   Public Shared Sub Main()
      Dim dt As DateTime = DateTime.Now
      
      ' Creates a CultureInfo for Japanese in Japan.
      Dim jp As New CultureInfo("ja-JP")
      
      jp.DateTimeFormat.Calendar = New JapaneseCalendar()
      Console.WriteLine(ControlChars.Newline + ControlChars.Newline + _
         "The current calendar set for the {0} culture is:" + _
         ControlChars.Newline + " {1}", jp.DisplayName.ToString(), _
         jp.DateTimeFormat.Calendar.ToString())
      Console.WriteLine(ControlChars.Newline + " The day is: {0}", _
         jp.DateTimeFormat.Calendar.GetDayOfMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The month is: {0}", _
         jp.DateTimeFormat.Calendar.GetMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The year is: {0}", _
         jp.DateTimeFormat.Calendar.GetYear(dt))

      jp.DateTimeFormat.Calendar = New GregorianCalendar()
      Console.WriteLine(ControlChars.Newline + ControlChars.Newline + _
         "The current calendar set for the {0} culture is:" + _
         ControlChars.Newline + " {1}", jp.DisplayName.ToString(), _
         jp.DateTimeFormat.Calendar.ToString())
      Console.WriteLine(ControlChars.Newline + " The day is: {0}", _
         jp.DateTimeFormat.Calendar.GetDayOfMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The month is: {0}", _
         jp.DateTimeFormat.Calendar.GetMonth(dt))
      Console.WriteLine(ControlChars.Newline + " The year is: {0}", _
         jp.DateTimeFormat.Calendar.GetYear(dt))
   End Sub
End Class
using System;
using System.Threading;
using System.Globalization;

public class TestClass
{
   public static void Main()
   {
      DateTime dt = DateTime.Now;

      // Creates a CultureInfo for Japanese in Japan.
      CultureInfo jp = new CultureInfo("ja-JP");
      Thread.CurrentThread.CurrentCulture = jp;   

      jp.DateTimeFormat.Calendar = new JapaneseCalendar();
      Console.WriteLine ("\n\nThe current calendar set for the {0} culture 
            is:\n {1}", jp.DisplayName.ToString(), 
            jp.DateTimeFormat.Calendar.ToString());

      Console.WriteLine ("\nThe day is: {0}", 
            jp.DateTimeFormat.Calendar.GetDayOfMonth(dt));
      Console.WriteLine ("\nThe month is: {0}", 
            jp.DateTimeFormat.Calendar.GetMonth(dt));
      Console.WriteLine ("\nThe year is: {0}",
            jp.DateTimeFormat.Calendar.GetYear(dt));

      jp.DateTimeFormat.Calendar = new GregorianCalendar();
      Console.WriteLine ("\n\nThe current calendar set for the {0} culture 
            is:\n {1}", jp.DisplayName.ToString(), 
            jp.DateTimeFormat.Calendar.ToString());

      Console.WriteLine ("\nThe day is: {0}", 
            jp.DateTimeFormat.Calendar.GetDayOfMonth(dt));
      Console.WriteLine ("\nThe month is: {0}", 
            jp.DateTimeFormat.Calendar.GetMonth(dt));
      Console.WriteLine ("\nThe year is: {0}", 
            jp.DateTimeFormat.Calendar.GetYear(dt));
   }
}

В результате выполнения кода получены следующие выходные данные:

The current calendar set for the Japanese (Japan) culture is:
System.Globalization.JapaneseCalendar
The day is: 3
The month is: 8
The year is: 13

The current calendar set for the Japanese (Japan) culture is:
System.Globalization.GregorianCalendar
The day is: 3
The month is: 8
The year is: 2001

См. также

Основные понятия

Форматирование даты и времени для определенного языка и региональных параметров

Другие ресурсы

Шифрование и локализация