共用方式為


使用特定文化特性的日曆

更新:2007 年 11 月

全球化的應用程式必須來顯示和使用以目前的文化特性為基礎的日曆。.NET Framework 提供 Calendar 類別以及下列類別實作:

CultureInfo 類別具有可以指定文化特性預設日曆的 Calendar 屬性。有些文化特性支援一個以上的日曆。OptionalCalendars 屬性會指定這種文化特性支援的選擇性日曆。

下列程式碼範例為指定為 "th-TH" 的泰文 (泰國) 和指定為 "ja-JP" 的日文 (日本) 文化特性建立 CultureInfo 物件。此範例會顯示每個文化特性的預設和選擇性日曆。請注意,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

請參閱

概念

格式化特定文化特性的日期和時間

其他資源

編碼和當地語系化