Verwenden von Kalendern für bestimmte Kulturen

Aktualisiert: November 2007

Eine globalisierte Anwendung sollte in der Lage sein, Kalender entsprechend der aktuellen Kultur anzuzeigen und zu verwenden. .NET Framework stellt die Calendar-Klasse sowie die folgenden Klassenimplementierungen bereit:

Die CultureInfo-Klasse verfügt über eine Calendar-Eigenschaft, die den Standardkalender für eine Kultur angibt. Einige Kulturen unterstützen mehr als einen Kalender. Die OptionalCalendars-Eigenschaft gibt die optionalen Kalender an, die von diesem Kulturtyp unterstützt werden.

Im folgenden Codebeispiel werden CultureInfo-Objekte für die Kulturen Thai (Thailand) mit der Bezeichnung "th-TH" und Japanisch (Japan) mit der Bezeichnung "ja-JP" erstellt. Im Beispiel werden die Standardkalender und die optionalen Kalender für jede Kultur angezeigt. Beachten Sie, dass das GregorianCalendar-Objekt in weitere Untertypen unterteilt ist. Die CalendarType-Eigenschaft gibt den Untertyp des gregorianischen Kalenders an. In diesem Beispiel wird jedes Mal, wenn als Kalender der gregorianische Kalender festgelegt wird, der CalendarType-Wert abgerufen und angezeigt. Eine Liste und Beschreibung der möglichen Werte für CalendarType finden Sie unter 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());
         }
   }
}

Dieser Code erzeugt die folgende Ausgabe:

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

Das folgende Codebeispiel zeigt, wie ähnliche Methoden in der DateTime-Struktur und der Calendar-Klasse unterschiedliche Ergebnisse für dieselbe Kultur abrufen können. Die CurrentCulture für den Thread wird auf "he-IL" (Hebräisch in Israel) festgelegt, und der aktuelle Kalender wird auf den hebräischen Kalender festgelegt. Es wird ein DateTime-Typ erstellt und initialisiert. Anschließend werden die Member von DateTime und Calendar verwendet, um den Tag, den Monat, das Jahr und die Anzahl der Monate im Jahr zurückzugeben und die entsprechenden Werte anzuzeigen. Nur die Methoden der Calendar-Klasse geben den Tag, den Monat, das Jahr und die Anzahl der Monate des Jahres basierend auf dem hebräischen Kalender zurück. DateTime-Methoden verwenden immer den gregorianischen Kalender, um Berechnungen unabhängig vom aktuellen Kalender durchzuführen.

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.");
   }
}

Dieser Code erzeugt die folgende Ausgabe:

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.

Das folgende Codebeispiel zeigt, wie sich die abgerufenen Werte für den aktuellen Monat, den Tag und das Jahr in Abhängigkeit vom aktuellen Kalender, der für eine bestimmte Kultur festgelegt wurde, unterscheiden können. Die CurrentCulture für den Thread wird auf "ja-JP" festgelegt, und der Kalender wird auf JapaneseCalendar festgelegt. Tag, Monat und Jahr werden zurückgegeben und angezeigt. Anschließend wird der Kalender auf GregorianCalendar festgelegt, und der Tag, der Monat und das Jahr werden zurückgegeben und angezeigt. Beachten Sie, wie sich das Jahr in Abhängigkeit vom aktuellen Kalender unterscheidet. Der japanische Kalender gibt das Jahr als 13 zurück, während der gregorianische Kalender das Jahr als 2001 zurückgibt.

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));
   }
}

Dieser Code erzeugt die folgende Ausgabe:

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

Siehe auch

Konzepte

Formatieren von Datum und Uhrzeit für eine bestimmte Kultur

Weitere Ressourcen

Codierung und Lokalisierung