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

La estructura DateTime proporciona métodos como DateTime.ToString y DateTime.Parse, que permiten realizar operaciones que tienen en cuenta la referencia cultural en DateTime. La clase DateTimeFormatInfo se usa para aplicar formato y mostrar una estructura DateTime según una referencia cultural. DateTimeFormatInfo define cómo se aplica el formato y se muestran los valores de DateTime, dependiendo de la referencia cultural. Por ejemplo, mediante ShortDatePattern, la fecha 1 de febrero de 2001 aparece con el formato 2/1/2001 para la referencia cultural "en-US" y con el formato 01/02/2001 para la referencia cultural "en-GB".

Se puede crear una instancia de la clase DateTimeFormatInfo para una referencia cultural específica o para la referencia cultural invariable, pero no para una referencia cultural neutra. Una referencia cultural neutra no proporciona suficiente información como para mostrar el formato de fecha correcta. Se producirá una excepción si se intenta crear una instancia de la clase DateTimeFormatInfo utilizando una referencia cultural neutra. Para obtener información adicional y ejemplos de cómo utilizar formatos de DateTime, vea Cadenas con formato de fecha y hora.

En el ejemplo de código siguiente se presenta la fecha actual mediante DateTimeFormatInfo.ShortDatePattern cuando CurrentThread.CurrentCulture está establecido como "en-US", inglés de los Estados Unidos, y después como "de-DE", alemán de Alemania.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class FormatDate
   
   Public Shared Sub Main()
      Dim dt As DateTime = DateTime.Now
      ' Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"))
      
      ' Creates a CultureInfo for German in Germany.
      Dim ci As New CultureInfo("de-DE")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class FormatDate
{
   public static void Main()
   {
      DateTime dt = DateTime.Now;
      // Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
      // Displays dt, formatted using the ShortDatePattern
      // and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"));
      
      // Creates a CultureInfo for German in Germany.
      CultureInfo ci = new CultureInfo("de-DE");
      // Displays dt, formatted using the ShortDatePattern
      // and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci));
   }
}

Si se ejecuta este código el 9 de julio de 2001, el resultado es el siguiente:

7/9/2001
09.07.2001

Trabajar con zonas horarias

Los métodos y las propiedades de la estructura DateTime siempre utilizan la zona horaria local para efectuar cálculos y comparaciones. Hay que tenerlo en cuenta al utilizar los métodos DateTime.Parse y DateTime.ParseExact. Estos métodos proporcionan sobrecargas que permiten convertir la representación en forma de cadena de una fecha y hora a un tipo DateTime. También es posible aplicar formato a DateTime para una referencia cultural específica. Si no se especifica una zona horaria en la cadena que se pasa a esos métodos, devuelven la fecha y hora analizada sin realizar ajustes de zona horaria. La fecha y hora se basan en la configuración de zona horaria del sistema. Si se especifica una zona horaria, esos métodos analizan la cadena de fecha y hora, la convierten a UTC (Coordinated Universal Time, Horario universal coordinado), anteriormente conocido como hora media de Greenwich o GMT, y a continuación la convierten a la hora del sistema local.

El métodoDateTime.ToUniversalTime se usa para convertir una estructura DateTime local a su equivalente en UTC. Para analizar una cadena de fecha y hora, y convertirla a una estructura DateTime de UTC, se utiliza el valor AdjustToUniversal de la enumeraciónDateTimeStyles con los métodos DateTime.Parse o DateTime.ParseExact. Estas operaciones de DateTime se ilustran en el ejemplo de código siguiente. En este ejemplo se crea una estructura DateTime para la hora local y después se convierte en la estructura DateTime equivalente de UTC. Ambos tipos se convierten en cadenas y se escriben en la consola. Observe que las cadenas difieren por el desfase de UTC entre la zona horaria local y el horario universal coordinado (UTC). Para obtener más información acerca del desfase de UTC para varias zonas horarias, vea Método TimeZone.GetUtcOffset. Las cadenas se convierten de nuevo a tipos DateTime mediante el método DateTime.ParseExact. Tenga en cuenta que, con el objetivo de capturar la información de zona horaria almacenada en utcdt, se debe especificar el valor AdjustToUniversal como parámetro del método DateTime.ParseExact.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class TimeZoneSample
   Public Shared Sub Main()
      Dim en As New CultureInfo("en-US")
      Thread.CurrentThread.CurrentCulture = en

      ' Creates a DateTime for the local time.
      Dim dt As New DateTime(2001, 7, 13, 4, 0, 0)

      ' Converts the local DateTime to the UTC time.
      Dim utcdt As DateTime = dt.ToUniversalTime()

      ' Defines a custom string format to display the DateTime.
      ' zzz specifies the full time zone offset.
      Dim format As [String] = "MM/dd/yyyy hh:mm:sszzz"

      ' Converts the local time to a string
      ' using the custom format string and display.
      Dim str As [String] = dt.ToString(format)
      Console.WriteLine(str)

      ' Converts the UTC time to a string
      ' using the custom format string and display.
      Dim utcstr As [String] = utcdt.ToString(format)
      Console.WriteLine(utcstr)

      ' Converts the string back to a local DateTime and displays it.
      Dim parsedBack As DateTime = DateTime.ParseExact(str, format, 
            en.DateTimeFormat)
      Console.WriteLine(parsedBack)

      ' Converts the string back to a UTC DateTime and displays it.
      ' If you do not use the DateTime.ParseExact method that takes
      ' a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      ' will not include the time zone information. 
      Dim parsedBackUTC As DateTime = DateTime.ParseExact(str, format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal)
      Console.WriteLine(parsedBackUTC)
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TimeZoneSample
{
   public static void Main()
   {
      CultureInfo en = new CultureInfo("en-US");
      Thread.CurrentThread.CurrentCulture = en;

      // Creates a DateTime for the local time.
      DateTime dt = new DateTime(2001, 7, 13, 4, 0, 0);

      // Converts the local DateTime to the UTC time.
      DateTime utcdt = dt.ToUniversalTime();

      // Defines a custom string format to display the DateTime value.
      // zzzz specifies the full time zone offset.
      String format = "MM/dd/yyyy hh:mm:sszzz";

      // Converts the local DateTime to a string 
      // using the custom format string and display.
      String str = dt.ToString(format);
      Console.WriteLine(str);

      // Converts the UTC DateTime to a string 
      // using the custom format string and display.
      String utcstr = utcdt.ToString(format);
      Console.WriteLine(utcstr);

      // Converts the string back to a local DateTime and displays it.
      DateTime parsedBack =
            DateTime.ParseExact(str,format,en.DateTimeFormat);
      Console.WriteLine(parsedBack);

      // Converts the string back to a UTC DateTime and displays it.
      // If you do not use the DateTime.ParseExact method that takes
      // a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      // object will not include the time zone information.
      DateTime parsedBackUTC = DateTime.ParseExact(str,format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal);
      Console.WriteLine(parsedBackUTC);
   }
}

Este código genera el resultado siguiente:

07/13/2001 04:00:00-07:00
07/13/2001 11:00:00-07:00
7/13/2001 4:00:00 AM
7/13/2001 11:00:00 AM

Trabajar con miembros de DateTime

Al utilizar los métodos que proporciona la estructura DateTime, debe tener en cuenta que los miembros como DateTime.Day, DateTime.Month,DateTime.Year y DateTime.AddDays se basan en el calendario gregoriano. Incluso aunque cambie el calendario actual en el código de una aplicación o cambie la configuración de fecha y hora a través del cuadro de diálogo Configuración regional del Panel de control, se seguirá usando el calendario gregoriano para realizar los cálculos para esos métodos. Esta funcionalidad evita que las operaciones aritméticas realizadas por estos métodos resulten dañadas por la configuración de usuario. Si desea realizar operaciones de fecha y hora basadas en el calendario actual que tengan en cuenta la referencia cultural, debe utilizar la propiedadDateTimeFormatInfo.Calendar para llamar a los métodos proporcionados por la clase Calendar, como Calendar.GetDayOfMonth, Calendar.GetMonth, Calendar.GetYear y Calendar.AddDays. Para obtener un ejemplo de la diferencia de los valores devueltos por los miembros de DateTime y los miembros de la clase Calendar, vea Utilizar calendarios para referencias culturales específicas.

Cuando trabaje con la estructura DateTime, tenga en cuenta que DateTime es un tipo de valor y es inmutable. Por lo tanto, operaciones como DateTime.AddDays devuelven un nuevo valor DateTime en vez de incrementar el valor existente. En el ejemplo siguiente se muestra cómo incrementar DateTime en un día utilizando la instrucción dt = dt.AddDays(1).

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

Public Class TestClass
   
   Public Shared Sub Main()
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      
      Dim dt As DateTime = DateTime.Now
      Console.WriteLine(ControlChars.Newline + " Today is {0}", _
         DateTime.Now.ToString("d"))
      
      ' Increments dt by one day.
      dt = dt.AddDays(1)
      Console.WriteLine(ControlChars.Newline + " Tomorrow is {0}", _
         dt.ToString("d"))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TestClass
{
   public static void Main()
   {
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

      DateTime dt = DateTime.Now;
      Console.WriteLine("Today is {0}", DateTime.Now.ToString("d"));

      // Increments dt by one day.
      dt = dt.AddDays(1);
      Console.WriteLine("Tomorrow is {0}", dt.ToString("d"));

   }
}

Si ejecuta este código el 3 de agosto de 2001, el resultado es el siguiente:

Today is 8/3/2001
Tomorrow is 8/4/2001

Vea también

Referencia

DateTime

Conceptos

Cadenas de formato de fecha y hora

Otros recursos

Codificación y localización