Compartir a través de


Utilizar calendarios para referencias culturales específicas

Actualización: noviembre 2007

Una aplicación globalizada debe poder mostrar y utilizar calendarios basados en la referencia cultural actual. .NET Framework proporciona la clase Calendar así como las implementaciones de clase siguientes:

La clase CultureInfo tiene una propiedad Calendar que especifica el calendario predeterminado de una referencia cultural. Algunas referencias culturales admiten más de un calendario. La propiedad OptionalCalendars especifica los calendarios opcionales admitidos por este tipo de referencia cultural.

En el ejemplo de código siguiente se crean los objetos CultureInfo para las referencias culturales tailandés (Tailandia), designado como "th-TH" y el japonés (Japón), designado como "ja-JP". En el ejemplo se muestran los calendarios predeterminados y opcionales para cada referencia cultural. Tenga en cuenta que el objeto GregorianCalendar se divide a su vez en subtipos. La propiedad CalendarType especifica el subtipo del calendario Gregoriano. En este ejemplo, cada vez que se determina que el calendario es gregoriano, se recupera y se muestra el valor CalendarType. Para obtener una lista y la explicación de los posibles valores de CalendarType, vea 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());
         }
   }
}

Este código genera el resultado siguiente:

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

En el ejemplo de código siguiente se muestra cómo los métodos similares de la estructura DateTime y de la clase Calendar pueden devolver resultados diferentes para la misma referencia cultural. La CurrentCulture del subproceso se establece en "he-IL" (hebreo de Israel), y el calendario actual se establece en el calendario hebreo. Se crea e inicializa un tipo DateTime. A continuación, se utilizan los miembros de DateTime y de Calendar para devolver el día, mes, año y número de meses del año, y se muestran esos valores. Sólo los métodos de clase Calendar devuelven el día, mes, año y número de meses del año del calendario hebreo. Los métodos DateTime siempre utilizan el calendario gregoriano para realizar los cálculos, sin tener en cuenta el calendario actual.

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

Este código genera el resultado siguiente:

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.

En el ejemplo de código siguiente se ilustra la forma en que los valores devueltos para el mes, día y año actuales pueden variar en función del calendario actual establecido para una referencia cultural específica. Para el subproceso, CurrentCulture se ha establecido en "ja-JP" y el calendario se ha establecido en JapaneseCalendar. Se devuelve y se muestra el día, mes y año. A continuación, el calendario se establece como GregorianCalendary se devuelve y se muestra el día, mes y año. Observe cómo difiere el año dependiendo del calendario actual. El calendario japonés devuelve el año como 13, mientras que el calendario gregoriano devuelve el año como 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));
   }
}

Este código genera el resultado siguiente:

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

Vea también

Conceptos

Aplicar formato de fecha y hora para una referencia cultural específica

Otros recursos

Codificación y localización