Analisar cadeias de caracteres de data e hora no .NET
A análise de cadeias de caracteres para convertê-las em DateTime objetos requer que você especifique informações sobre como as datas e horas são representadas como texto. Culturas diferentes usam ordens diferentes para dia, mês e ano. Algumas representações de tempo usam um relógio de 24 horas, outras especificam "AM" e "PM". Algumas candidaturas necessitam apenas da data. Outros precisam apenas do tempo. Outros ainda precisam especificar a data e a hora. Os métodos que convertem cadeias de caracteres em DateTime objetos permitem que você forneça informações detalhadas sobre os formatos esperados e os elementos de uma data e hora de que seu aplicativo precisa. Há três subtarefas para converter corretamente o texto em um DateTime:
- Você deve especificar o formato esperado do texto que representa uma data e hora.
- Você pode especificar a cultura para o formato de uma data e hora.
- Você pode especificar como os componentes ausentes na representação de texto são definidos na data e hora.
Os Parse métodos e TryParse convertem muitas representações comuns de uma data e hora. Os ParseExact métodos and TryParseExact convertem uma representação de cadeia de caracteres que está em conformidade com o padrão especificado por uma cadeia de caracteres de formato de data e hora. Para obter mais informações, consulte os artigos sobre cadeias de caracteres de formato de data e hora padrão e cadeias de caracteres de formato de data e hora personalizadas.
O objeto atual DateTimeFormatInfo fornece mais controle sobre como o texto deve ser interpretado como data e hora. As propriedades de a DateTimeFormatInfo descrevem os separadores de data e hora, os nomes de meses, dias e eras e o formato das designações "AM" e "PM". O CultureInfo devolvido por CultureInfo.CurrentCulture tem uma CultureInfo.DateTimeFormat propriedade que representa a cultura atual. Se desejar uma cultura específica ou configurações personalizadas, especifique o IFormatProvider parâmetro de um método de análise. Para o IFormatProvider parâmetro, especifique um CultureInfo objeto, que representa uma cultura, ou um DateTimeFormatInfo objeto.
O texto que representa uma data ou hora pode estar faltando algumas informações. Por exemplo, a maioria das pessoas assumiria que a data "12 de março" representa o ano atual. Da mesma forma, "março de 2018" representa o mês de março no ano de 2018. O texto que representa o tempo geralmente inclui apenas horas, minutos e uma designação AM/PM. Os métodos de análise lidam com essas informações ausentes usando padrões razoáveis:
- Quando apenas a hora está presente, a parte de data usa a data atual.
- Quando apenas a data está presente, a parte do tempo é meia-noite.
- Quando o ano não é especificado em uma data, o ano atual é usado.
- Quando o dia do mês não é especificado, o primeiro dia do mês é usado.
Se a data estiver presente na cadeia de caracteres, ela deve incluir o mês e um do dia ou ano. Se a hora estiver presente, deve incluir a hora e os minutos ou o designador AM/PM.
Você pode especificar a NoCurrentDateDefault constante para substituir esses padrões. Quando você usa essa constante, todas as propriedades de ano, mês ou dia ausentes são definidas como o valor 1
. O último exemplo usando Parse demonstra esse comportamento.
Além de um componente de data e hora, a representação de cadeia de caracteres de uma data e hora pode incluir um deslocamento que indica o quanto a hora difere do Tempo Universal Coordenado (UTC). Por exemplo, a string "2/14/2007 5:32:00 -7:00" define uma hora que é sete horas mais cedo do que UTC. Se um deslocamento for omitido da representação de cadeia de caracteres de um tempo, a análise retornará um DateTime objeto com sua Kind propriedade definida como DateTimeKind.Unspecified. Se um deslocamento for especificado, a análise retornará um DateTime objeto com sua Kind propriedade definida como DateTimeKind.Local. O seu valor também é ajustado ao fuso horário local da sua máquina. Você pode modificar esse comportamento usando um DateTimeStyles valor com o método de análise.
O provedor de formato também é usado para interpretar uma data numérica ambígua. Não está claro quais componentes da data representada pela cadeia de caracteres "02/03/04" são o mês, o dia e o ano. Os componentes são interpretados de acordo com a ordem de formatos de data semelhantes no provedor de formato.
Análise
O exemplo a seguir ilustra o DateTime.Parse uso do método para converter a string
em um DateTimearquivo . Este exemplo usa a cultura associada ao thread atual. Se o CultureInfo associado à cultura atual não puder analisar a cadeia de caracteres de entrada, um FormatException será lançado.
Gorjeta
Todos os exemplos de C# neste artigo são executados em seu navegador. Pressione o botão Run (Executar ) para ver a saída. Você também pode editá-los para experimentar.
Nota
Esses exemplos estão disponíveis no repositório de documentos do GitHub para C# e Visual Basic.
string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
// 1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
' 1/1/2009 00:00:00
Você também pode definir explicitamente a cultura cujas convenções de formatação são usadas quando você analisa uma cadeia de caracteres. Você especifica um dos objetos padrão DateTimeFormatInfo retornados pela CultureInfo.DateTimeFormat propriedade. O exemplo a seguir usa um provedor de formato para analisar uma cadeia de caracteres em alemão em um DateTimearquivo . Cria uma CultureInfo representação da de-DE
cultura. Esse CultureInfo
objeto garante a análise bem-sucedida dessa cadeia de caracteres específica. Este processo impede qualquer configuração no CurrentCultureCurrentThread.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
// 6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
' 6/12/2008 00:00:00
No entanto, você pode usar sobrecargas do Parse método para especificar provedores de formato personalizado. O Parse método não suporta a análise de formatos não padrão. Para analisar uma data e hora expressas em um formato não padrão, use o ParseExact método.
O exemplo a seguir usa a DateTimeStyles enumeração para especificar que as informações de data e hora atuais não devem ser adicionadas aos DateTime campos não especificados.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
// 6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
' 6/12/2008 00:00:00
AnalisarExacto
O DateTime.ParseExact método converte uma cadeia de caracteres em um DateTime objeto se ela estiver em conformidade com um dos padrões de cadeia de caracteres especificados. Quando uma cadeia de caracteres que não é uma das formas especificadas é passada para esse método, um FormatException é lançado. Você pode especificar um dos especificadores de formato de data e hora padrão ou uma combinação dos especificadores de formato personalizado. Usando os especificadores de formato personalizados, é possível construir uma cadeia de caracteres de reconhecimento personalizada. Para obter uma explicação dos especificadores, consulte os artigos sobre cadeias de caracteres de formato de data e hora padrão e cadeias de caracteres de formato de data e hora personalizadas.
No exemplo a seguir, o DateTime.ParseExact método é passado um objeto string para analisar, seguido por um especificador de formato, seguido por um CultureInfo objeto. Esse ParseExact método só pode analisar cadeias de caracteres que seguem o padrão de data longa na en-US
cultura.
var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
try
{
var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
Console.WriteLine(dateTime);
}
catch (FormatException)
{
Console.WriteLine("Unable to parse '{0}'", dateString);
}
}
// The example displays the following output:
// Unable to parse ' Friday, April 10, 2009'
// 4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
Try
Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
MyCultureInfo)
Console.WriteLine(MyDateTime)
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'", dateString)
End Try
Next
' The example displays the following output:
' Unable to parse ' Friday, April 10, 2009'
' 4/10/2009 00:00:00
Cada sobrecarga dos métodos e ParseExact também tem um IFormatProvider parâmetro que fornece informações específicas da Parse cultura sobre a formatação da cadeia de caracteres. O IFormatProvider objeto é um CultureInfo objeto que representa uma cultura padrão ou um DateTimeFormatInfo objeto que é retornado pela CultureInfo.DateTimeFormat propriedade. ParseExact também usa um argumento adicional de cadeia de caracteres ou matriz de cadeia de caracteres que define um ou mais formatos personalizados de data e hora.