Analizar cadenas de fecha y hora
Actualización: noviembre 2007
Los métodos de análisis convierten la representación de cadena de una fecha y hora en un objeto DateTime equivalente. Los métodos Parse y TryParse convierten cualquier representación de una serie de representaciones comunes de fecha y hora. Los métodos ParseExact y TryParseExact convierten una representación de cadena que se ajusta al patrón especificado por una cadena de formato de fecha y hora.
El análisis se ve influenciado por las propiedades de un proveedor de formato que proporciona información como, por ejemplo, las cadenas utilizadas para los separadores de fecha y hora y los nombres de los meses, días y eras. El proveedor de formato es el objeto DateTimeFormatInfo actual, proporcionado implícitamente por la referencia cultural del subproceso actual o explícitamente por el parámetro IFormatProvider de un método de análisis. Para el parámetro IFormatProvider, especifique un objeto CultureInfo, que representa una referencia cultural o un objeto DateTimeFormatInfo.
La representación de cadena de una fecha que vaya a analizarse deberá incluir el mes y, por lo menos, un día o año. La representación de cadena de una hora deberá incluir la hora y, por lo menos, los minutos o el designador a.m./p.m. No obstante, si es posible, el análisis proporciona valores predeterminados para los componentes omitidos. Si falta una fecha, se utiliza el valor predeterminado de fecha actual; si falta un año, el año actual; si falta un día del mes, el primer día del mes; y si falta una hora, la medianoche.
Si la representación de cadena sólo especifica una hora, el análisis devuelve un objeto DateTime con las propiedades Year, Month y Day establecidas en los valores correspondientes a la propiedad Today. Sin embargo, si en el método de análisis se especifica la constante NoCurrentDateDefault, las propiedades de año, mes y día resultantes se establecen en el valor 1.
Además de un componente de fecha y hora, la representación de cadena de una fecha y una hora puede incluir un desplazamiento que indica la diferencia de la hora con respecto a la hora universal coordinada (UTC). Por ejemplo, la cadena "2/14/2007 5:32:00 -7:00" define una hora que es siete horas más temprano que la hora UTC. Si en la representación de cadena de una hora se omite la diferencia, el análisis devuelve un objeto DateTime cuya propiedad Kind está establecida en DateTimeKind.Unspecified. Si se especifica una diferencia, el análisis devuelve un objeto DateTime cuya propiedad Kind está establecida en Local y cuyo valor está ajustado a la zona horaria local del equipo. Puede modificar este comportamiento utilizando una constante DateTimeStyles con el método de análisis.
El proveedor de formato también se utiliza para interpretar una fecha numérica ambigua. Por ejemplo, no queda claro qué componentes de la fecha representados por la cadena "02/03/04" corresponden al mes, al día y al año. En este caso, los componentes se interpretan según el orden de formatos de fecha similares del proveedor de formato.
Parse
En el ejemplo de código siguiente se ilustra el uso del método Parse para convertir una cadena en DateTime. En este ejemplo, para realizar el análisis, se utiliza la referencia cultural asociada al subproceso actual. Si el objeto CultureInfo asociado a la referencia cultural actual no puede analizar la cadena de entrada, se produce una excepción FormatException.
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 12:00:00 AM
string MyString = "Jan 1, 2009";
DateTime MyDateTime = DateTime.Parse(MyString);
Console.WriteLine(MyDateTime);
// Displays the following output on a system whose culture is en-US:
// 1/1/2009 12:00:00 AM
También puede establecer un objeto CultureInfo en una de las referencias culturales definidas por ese objeto, o puede especificar uno de los objetos DateTimeFormatInfo estándar devueltos por la propiedad CultureInfo.DateTimeFormat. En el ejemplo de código siguiente se utiliza un proveedor de formato para analizar una cadena alemana en un objeto DateTime. Un objeto CultureInfo que representa la referencia cultural de-DE se define y se pasa con la cadena que se está analizando para garantizar el análisis correcto de esta cadena concreta. Esto descarta el valor que tenga CurrentCulture de CurrentThread.
Imports System.Globalization
Module Example
Public Sub Main()
Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
End Sub
End Module
' The example displays the following output:
' 6/12/2008 12:00:00 AM
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
Console.WriteLine(MyDateTime);
}
}
// The example displays the following output:
// 6/12/2008 12:00:00 AM
Sin embargo, aunque puede utilizar sobrecargas del método Parse para especificar proveedores de formato personalizado, el método no admite el uso de proveedores de formato no estándar. Para analizar una fecha y una hora expresadas en un formato no estándar, utilice en su lugar el método ParseExact.
En el ejemplo de código siguiente se utiliza la enumeración DateTimeStyles para especificar que la información de fecha y hora actual no se debe agregar al objeto DateTime en los campos que la cadena no defina.
Imports System.Globalization
Module Example
Public Sub Main()
Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo, _
DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
End Sub
End Module
' The example displays the following output if the current culture is en-US:
' 6/12/2008 12:00:00 AM
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = 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 12:00:00 AM
ParseExact
El método DateTime.ParseExact convierte una cadena que se ajusta a un patrón de cadena especificado en un objeto DateTime. Cuando se pasa a este método una cadena que no tiene el formato especificado, se produce una excepción FormatException. Se puede definir uno de los especificadores de formato de fecha y hora estándar o una combinación limitada de los especificadores de formato de fecha y hora personalizados. Si se usan los especificadores de formato personalizados, se puede construir una cadena de reconocimiento personalizada. Para obtener información sobre los especificadores, vea la sección Cadenas de formato de fecha y hora.
Cada sobrecarga del método ParseExact también tiene un parámetro IFormatProvider que, normalmente, proporciona información específica de la referencia cultural sobre el formato de la cadena. Normalmente, este objeto IFormatProvider es un objeto CultureInfo que representa una referencia cultural estándar o un objeto DateTimeFormatInfo devuelto por la propiedad CultureInfo.DateTimeFormat. Sin embargo, a diferencia de las demás funciones de análisis de fecha y hora, este método también admite una interfaz IFormatProvider que define un formato de fecha y hora no estándar.
En el ejemplo de código siguiente, se pasa al método ParseExact un objeto de cadena que se debe analizar, seguido de un especificador de formato, seguido de un objeto CultureInfo. Este método ParseExact sólo puede analizar cadenas que muestren el modelo de fecha larga de la referencia cultural en-US.
Imports System.Globalization
Module Example
Public Sub Main()
Dim MyCultureInfo As CultureInfo = 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
End Sub
End Module
' The example displays the following output:
' Unable to parse ' Friday, April 10, 2009'
' 4/10/2009 12:00:00 AM
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo MyCultureInfo = new CultureInfo("en-US");
string[] MyString = {" Friday, April 10, 2009", "Friday, April 10, 2009"};
foreach (string dateString in MyString)
{
try {
DateTime MyDateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo);
Console.WriteLine(MyDateTime);
}
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 12:00:00 AM