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

La estructura DateTime proporciona métodos que permiten a las aplicaciones realizar operaciones que tienen en cuenta la referencia cultural en un tipo DateTime. Una aplicación puede utilizar la clase DateTimeFormatInfo para dar formato y mostrar un tipo DateTime basó en función de la referencia cultural. Por ejemplo, si se utiliza DateTimeFormatInfo.ShortDatePattern, se puede dar formato a la fecha 1 de febrero de 2001 como 2/1/2001 para la referencia cultural Inglés (Estados Unidos), "en-US", 01/02/2001 para la referencia cultural Inglés (Reino Unido), "en-GB".

Se puede crear un objeto DateTimeFormatInfo para una referencia cultural determinada 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. Si la aplicación intenta crear un objeto DateTimeFormatInfo mediante una referencia cultural neutra, se produce una excepción. Para obtener información adicional y ejemplos de cómo utilizar los formatos de DateTime, vea Cadenas de formato de fecha y hora.

El ejemplo de código siguiente muestra la fecha actual mediante DateTimeFormatInfo.ShortDatePattern cuando la referencia cultural actual de Thread.CurrentThread se establece en Inglés (Estados Unidos), "en-US" y, a continuación, en Alemán (Alemania), "de DE".

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

La estructura DateTime siempre utiliza la zona horaria local para los cálculos y comparaciones. Debe tener en cuenta este detalle cuando su aplicación utilice 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. Su aplicación también puede dar formato a un tipo DateTime para una referencia cultural determinada. 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 basa en la configuración de zona horaria del sistema operativo. Si la aplicación especifica una diferencia 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.

La aplicación debe utilizar el método DateTime.ToUniversalTime para convertir un tipo DateTime local en su equivalente UTC. Para analizar una cadena de fecha y hora y convertirla en un tipo de DateTime UTC, la aplicación debe utilizar el valor de enumeración DateTimeStyles.AdjustToUniversal con los métodos DateTime.Parse o DateTime.ParseExact.

En el código siguiente se crea un tipo DateTime para la hora local y, después, se convierte en su UTC equivalente. Ambos tipos se convierten en cadenas y se escriben en la consola. Observe que las cadenas difieren por la diferencia horaria respecto a UTC entre la zona horaria local y el horario UTC. Las cadenas se convierten de nuevo en tipos DateTime mediante el método DateTime.ParseExact. Para capturar la información de zona horaria almacenada en utcdt, se debe especificar el valor DateTimeStyles.AdjustToUniversal como parámetro del método DateTime.ParseExact. Para obtener más información sobre la diferencia horaria respecto a UTC de las diferentes zonas horarias, vea GetUtcOffset.

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

Cuando utilice la estructura DateTime, tenga en cuenta que los miembros como DateTime.Day se basan en el calendario gregoriano. Aunque su aplicación cambie el calendario actual o permita al usuario cambiar los valores de fecha y hora a través de las opciones de configuración regional e idioma del Panel de control, el calendario gregoriano se seguirá utilizando para realizar los cálculos de los métodos DateTime, que evitan que las operaciones aritméticas realizadas por estos métodos resulten dañadas por la configuración del usuario. Si desea que su aplicación realice operaciones de fecha y hora que tengan en cuenta la referencia cultural basadas en el calendario actual, la aplicación debe utilizar la propiedad DateTimeFormatInfo.Calendar para llamar a los métodos proporcionados por la clase Calendar, como Calendar.GetDayOfMonth. Para obtener un ejemplo de la diferencia de los valores recuperados por los miembros de DateTime y los miembros de DateTimeFormatInfo.Calendar, vea Utilizar calendarios para referencias culturales específicas.

Cuando trabaje con la estructura DateTime, tenga en cuenta que un tipo DateTime es un valor inmutable. Por consiguiente, los métodos como DateTime.AddDays recuperan un nuevo valor DateTime en lugar de incrementar un valor existente. En el ejemplo siguiente se muestra cómo incrementar un tipo 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

Otros recursos

Codificación y localización

Date and Time Format Strings