Compartir a través de


Análisis de cadenas de fecha y hora en .NET

El análisis de cadenas para convertirlos en DateTime objetos requiere que especifique información sobre cómo se representan las fechas y horas como texto. Las diferentes culturas utilizan distintos órdenes para día, mes y año. Algunas representaciones de tiempo usan un reloj de 24 horas, otros especifican "AM" y "PM". Algunas aplicaciones solo necesitan la fecha. Otros solo necesitan el tiempo. Otros usuarios deben especificar la fecha y la hora. Los métodos que convierten cadenas en DateTime objetos permiten proporcionar información detallada sobre los formatos esperados y los elementos de una fecha y hora que necesita la aplicación. Hay tres subtareas para convertir correctamente el texto en :DateTime

  1. Debe especificar el formato esperado del texto que representa una fecha y hora.
  2. Puede especificar la referencia cultural para el formato de una fecha y hora.
  3. Puede especificar cómo se establecen en la fecha y hora los componentes que faltan en la representación de texto.

Los Parse métodos y TryParse convierten muchas representaciones comunes de una fecha y hora. Los ParseExact métodos y TryParseExact convierten una representación de cadena que se ajusta al patrón especificado por una cadena de formato de fecha y hora. Para obtener más información, consulte los artículos sobre cadenas de formato de fecha y hora estándar y cadenas de formato de fecha y hora personalizadas.

El objeto actual DateTimeFormatInfo proporciona más control sobre cómo se debe interpretar el texto como una fecha y hora. Las propiedades de un DateTimeFormatInfo describen los separadores de fecha y hora, los nombres de los meses, los días y las eras, y el formato de las designaciones "AM" y "PM". El CultureInfo devuelto por CultureInfo.CurrentCulture tiene una CultureInfo.DateTimeFormat propiedad que representa la referencia cultural actual. Si desea una referencia cultural específica o una configuración personalizada, especifique el IFormatProvider parámetro de un método de análisis. Para el IFormatProvider parámetro , especifique un CultureInfo objeto , que representa una referencia cultural o un DateTimeFormatInfo objeto .

Es posible que el texto que represente una fecha o hora falte información. Por ejemplo, la mayoría de las personas asumirían que la fecha "12 de marzo" representa el año actual. Del mismo modo, "marzo de 2018" representa el mes de marzo en el año 2018. El texto que representa el tiempo a menudo solo incluye horas, minutos y una designación am/PM. Los métodos de análisis controlan esta información que falta mediante valores predeterminados razonables:

  • Cuando solo está presente la hora, la parte de fecha usa la fecha actual.
  • Cuando solo está presente la fecha, la hora es medianoche.
  • Cuando el año no se especifica en una fecha, se usa el año actual.
  • Cuando no se especifica el día del mes, se usa el primer día del mes.

Si la fecha está presente en la cadena, debe incluir el mes y uno del día o año. Si la hora está presente, debe incluir la hora, y ya sea los minutos o el designador AM/PM.

Puede especificar la NoCurrentDateDefault constante para invalidar estos valores predeterminados. Cuando se usa esa constante, las propiedades de año, mes o día que faltan se establecen en el valor 1. El último ejemplo que usa Parse muestra este comportamiento.

Además de una fecha y un componente de hora, la representación de cadena de una fecha y hora puede incluir un desplazamiento que indica cuánto difiere la hora de la hora universal coordinada (UTC). Por ejemplo, la cadena "2/14/2007 5:32:00 -7:00" define una hora que es siete horas anteriores a las UTC. Si se omite un desplazamiento de la representación de cadena de un tiempo, el análisis devuelve un DateTime objeto con su Kind propiedad establecida en DateTimeKind.Unspecified. Si se especifica un desplazamiento, se devuelve un DateTime objeto con su propiedad Kind establecida en DateTimeKind.Local. Su valor también se ajusta a la zona horaria local de la máquina. Puede modificar este comportamiento mediante un valor DateTimeStyles con el método de análisis sintáctico.

El proveedor de formato también se usa para interpretar una fecha numérica ambigua. No está claro qué componentes de la fecha representada por la cadena "02/03/04" son el mes, el día y el año. Los componentes se interpretan según el orden de formatos de fecha similares en el proveedor de formato.

Parse

En el ejemplo siguiente se muestra el uso del método DateTime.Parse para convertir un string en un DateTime. En este ejemplo se usa la referencia cultural asociada al subproceso actual. Si el CultureInfo asociado a la referencia cultural actual no puede analizar la cadena de entrada, se produce una FormatException.

Nota:

Estos ejemplos están disponibles en el repositorio de documentos de GitHub para C# y 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

También puede definir explícitamente la referencia cultural cuyas convenciones de formato se usan al analizar una cadena. Especifique uno de los objetos estándar DateTimeFormatInfo devueltos por la CultureInfo.DateTimeFormat propiedad . En el ejemplo siguiente se usa un proveedor de formato para analizar una cadena alemana en .DateTime Crea un CultureInfo que representa la cultura de-DE. Ese CultureInfo objeto garantiza el análisis correcto de esta cadena determinada. Este proceso impide cualquier configuración en CurrentCulture de la CurrentThread.

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

Sin embargo, puede usar sobrecargas del Parse método para especificar proveedores de formato personalizados. El Parse método no admite el análisis de formatos no estándar. Para analizar una fecha y hora expresadas en un formato no estándar, use el ParseExact método en su lugar.

En el ejemplo siguiente se usa la DateTimeStyles enumeración para especificar que la información actual de fecha y hora no se debe agregar a los DateTime campos no 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

ParseExact

El DateTime.ParseExact método convierte una cadena en un DateTime objeto si se ajusta a uno de los patrones de cadena especificados. Cuando se pasa una cadena que no es uno de los formatos especificados a este método, se produce una FormatException excepción. Puede especificar uno de los especificadores de formato de fecha y hora estándar o una combinación de los especificadores de formato personalizado. Con los especificadores de formato personalizado, es posible construir una cadena de reconocimiento personalizada. Para obtener una explicación de los especificadores, consulte los artículos sobre cadenas de formato de fecha y hora estándar y cadenas de formato de fecha y hora personalizadas.

En el ejemplo siguiente, al método DateTime.ParseExact se le pasa un objeto de cadena para analizar, seguido de un especificador de formato y un objeto CultureInfo. Este ParseExact método solo puede analizar cadenas que siguen el formato de fecha larga en la 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 '{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 de los métodos Parse y ParseExact también tiene un parámetro IFormatProvider que proporciona información cultural específica sobre el formato de la cadena. El IFormatProvider objeto es un CultureInfo objeto que representa una cultura estándar o un DateTimeFormatInfo objeto que se devuelve por la propiedad CultureInfo.DateTimeFormat. ParseExact también usa un argumento de cadena o matriz de cadenas adicional que define uno o varios formatos de fecha y hora personalizados.

Consulte también