A formatação de data e hora para uma cultura específica

O DateTime estrutura fornece métodos que permitem que seus aplicativos executar operações sensíveis à cultura em um DateTime tipo. Um aplicativo pode usar o DateTimeFormatInfo classe para formatar e exibir um DateTime tipo com base na cultura. Por exemplo, usando DateTimeFormatInfo.ShortDatePattern, a data de 1º de fevereiro de 2001, pode ser formatado como 1/2/2001 para inglês (Estados Unidos), "en-US", cultura e 02/01/2001 para inglês (Reino Unido), "en-GB", a cultura.

Um DateTimeFormatInfo objeto pode ser criado para uma cultura específica ou para a cultura invariável, mas não para uma cultura neutra. Uma cultura neutra não fornece informações suficientes para exibir o formato de data correta. Uma exceção é lançada se o aplicativo tenta criar um DateTimeFormatInfo usando o objeto de uma cultura neutra. Para obter informações e exemplos de uso DateTime formatação, consulte Date and Time Format Strings.

O exemplo de código a seguir exibe a data atual usando DateTimeFormatInfo.ShortDatePattern quando o Thread.CurrentThread a cultura atual está configurada para inglês (Estados Unidos), "en-US" e, em seguida, alemão (Alemanha), "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));
   }
}

Se você executar esse código em 9 de julho de 2001, a saída será assim:

7/9/2001
09.07.2001

Trabalhar com fusos horários

O DateTime estrutura sempre usa o fuso horário local para cálculos e comparações. Você deve considerar isso quando o aplicativo usa a DateTime.Parse e DateTime.ParseExact métodos. Esses métodos fornecem sobrecargas que permitem a conversão da representação de seqüência de caracteres de uma data e hora para um DateTime tipo. Seu aplicativo também pode formatar um DateTime tipo para uma cultura específica. Se um fuso horário não for especificado na seqüência de caracteres passada para esses métodos, eles recuperem analisada data e hora sem executar um ajuste do fuso horário. A data e hora com base na configuração de fuso horário do sistema operacional. Se o aplicativo especifica o deslocamento de fuso horário, esses métodos analisar a cadeia de caracteres de data/hora, convertê-lo em tempo Universal Coordenado (UTC), anteriormente conhecido como Greenwich Mean Time ou GMT e converta-o para a hora do sistema local.

O aplicativo deve usar o DateTime.ToUniversalTime método para converter um local DateTime tipo como seu UTC equivalente. Para analisar uma cadeia de caracteres de data/hora e convertê-lo em um UTC DateTime tipo, o aplicativo deve usar o DateTimeStyles.AdjustToUniversal o valor de enumeração com um a DateTime.Parse método ou a DateTime.ParseExact método.

O exemplo de código a seguir cria um DateTime o tipo para a hora local e a converte para o UTC equivalente. Ambos os tipos são convertidos em seqüências de caracteres e gravados no console. Observe que as seqüências de caracteres diferem com a compensação entre o UTC e o fuso horário UTC. Essas cadeias de caracteres são convertidas novamente em DateTime tipos usando o DateTime.ParseExact método. Para capturar as informações de fuso horário armazenadas em utcdt, o DateTimeStyles.AdjustToUniversal valor deve ser especificado como um parâmetro para o DateTime.ParseExact método. Para obter mais informações sobre o deslocamento UTC para vários fusos horários, consulte 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);
   }
}

Esse código produz a seguinte saída:

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

Trabalhando com membros de DateTime

Quando você usa o DateTime estrutura, esteja ciente de que os membros, como DateTime.Day baseiam-se no calendário gregoriano. Mesmo que seu aplicativo altera o calendário atual ou permite que o usuário alterar data e hora de configurações por meio das opções regionais e de idioma no painel de controle, o calendário gregoriano ainda é usado para executar os cálculos para DateTime métodos, que impede a aritmética executada por esses métodos seja corrompida pelas configurações do usuário. Se desejar que o seu aplicativo para realizar a data de cultura e operações de tempo com base no calendário atual, o aplicativo devem usar o DateTimeFormatInfo.Calendar propriedade para chamar os métodos fornecidos pelo Calendar de classe, como Calendar.GetDayOfMonth. Para obter um exemplo da diferença em valores recuperados pelo DateTime membros e o DateTimeFormatInfo.Calendar membros, consulte Usando calendários para culturas específicas.

Ao trabalhar com o DateTime estrutura, esteja ciente de que um DateTime o tipo é um valor imutável. Portanto, os métodos, como DateTime.AddDays recuperar uma nova DateTime o valor em vez de incrementar o valor existente. O exemplo a seguir ilustra como incrementar um DateTime tipo de um dia, usando a instrução 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"));

   }
}

Se você executar esse código em 3 de agosto de 2001, ele exibe a seguinte saída:

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

Consulte também

Outros recursos

Codificação e localização

Date and Time Format Strings