Analizar cadenas de fecha y hora en .NETParsing Date and Time Strings in .NET

El análisis de cadenas para convertirlas en objetos DateTime requiere que se especifique información sobre cómo se representan las fechas y horas en forma de texto.Parsing strings to convert them to DateTime objects requires you to specify information about how the dates and times are represented as text. Las distintas referencias culturales usan distintos órdenes de día, mes y año.Different cultures use different orders for day, month, and year. Algunas representaciones horarias usan el reloj de 24 horas y otras especifican "a. m." y "p. m.".Some time representations use a 24-hour clock, others specify "AM" and "PM." Algunas aplicaciones solo necesitan la fecha.Some applications need only the date. Otras solo necesitan la hora.Others need only the time. Pero otras necesitan especificar la fecha y la hora.Still others need to specify both the date and the time. Los métodos que convierten cadenas a objeto DateTime permiten especificar información detallada sobre los formatos esperados y los elementos de fecha y hora que precisa la aplicación.The methods that convert strings to DateTime objects enable you to provide detailed information about the formats you expect and the elements of a date and time your application needs. Hay tres subtareas para convertir correctamente el texto en un objeto DateTime:There are three subtasks to correctly converting text into a DateTime:

  1. Debe especificarse el formato esperado del texto que representa una fecha y hora.You must specify the expected format of the text representing a date and time.
  2. Es posible especificar la referencia cultural del formato de fecha y hora.You may specify the culture for the format of a date time.
  3. Puede especificarse cómo se establecen los componentes que faltan en la representación de texto en la fecha y hora.You may specify how missing components in the text representation are set in the date and time.

Los métodos Parse y TryParse convierten varias representaciones comunes de fecha y hora.The Parse and TryParse methods convert many common representations of a date and time. Los métodos ParseExact y TryParseExact convierten una representación de cadena que se ajusta al modelo especificado por una cadena de formato de fecha y hora.The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. (Para obtener más información, vea los artículos sobre cadenas con formato de fecha y hora estándar y cadenas con formato de fecha y hora personalizado).(See the articles on standard date and time format strings and custom date and time format strings for details.)

El objeto DateTimeFormatInfo actual proporciona más control sobre la forma en que debe interpretarse el texto como fecha y hora.The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. Las propiedades de un objeto DateTimeFormatInfo describen los separadores de fecha y hora, los nombres de los meses, días y eras, así como el formato de las designaciones "a. m." y "p. m.".Properties of a DateTimeFormatInfo describe the date and time separators, and the names of months, days, and eras, and the format for the "AM" and "PM" designations. La referencia cultural del subproceso actual proporciona un objeto DateTimeFormatInfo que representa la referencia cultural actual.The current thread culture provides a DateTimeFormatInfo that represents the current culture. Si quiere una referencia cultural específica o una configuración personalizada, especifique el parámetro IFormatProvider de un método de análisis.If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. Para el parámetro IFormatProvider, especifique un objeto CultureInfo, que representa una referencia cultural, o un objeto DateTimeFormatInfo.For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

Es posible que al texto que representa una fecha y hora le falte alguna información.The text representing a date or time may be missing some information. Por ejemplo, la mayoría de los usuarios supondría que la fecha "12 de marzo" representa el año actual.For example, most people would assume the date "March 12" represents the current year. Del mismo modo, "Marzo de 2018" representa el mes de marzo del año 2018.Similarly, "March 2018" represents the month of March in the year 2018. El texto que representa la hora a menudo solo incluye horas, minutos y una designación "a. m."/"p. m.".Text representing time often does only includes hours, minutes, and an AM/PM designation. Los métodos de análisis controlan esta información que falta mediante valores predeterminados razonables:Parsing methods handle this missing information by using reasonable defaults:

  • Cuando solo se indica la hora, la parte de fecha utiliza la fecha actual.When only the time is present, the date portion uses the current date.
  • Cuando solo se indica la fecha, la parte de hora es la medianoche.When only the date is present, the time portion is midnight.
  • Cuando no se especifica el año en una fecha, se usa el año actual.When the year isn't specified in a date, the current year is used.
  • Cuando no se especifica el día del mes, se usa el primero del mes.When the day of the month isn't specified, the first of the month is used.

Si la fecha se indica en la cadena, debe incluir el mes y uno de los dos valores, el día o el año.If the date is present in the string, it must include the month and one of the day or year. Si se indica la hora, debe incluir la hora y los minutos o el designador "a. m."/"p. m.".If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

Se puede especificar la constante NoCurrentDateDefault para invalidar los valores predeterminados.You can specify the NoCurrentDateDefault constant to override these defaults. Cuando se usa esta constante, las propiedades de año, mes o día se establecen en el valor 1.When you use that constant, any missing year, month, or day properties are set to the value 1. El último ejemplo con Parse muestra este comportamiento.The last example using Parse demonstrates this behavior.

Además de un componente de fecha y hora, la representación de cadena de una fecha y hora puede incluir una diferencia horaria que indica cuánto difiere la hora respecto de la hora universal coordinada (UTC).In addition to a date and a time component, the string representation of a date and time can include an offset that indicates how much the time differs from Coordinated Universal Time (UTC). Por ejemplo, la cadena "14/2/2007 5:32:00 -7:00" define una hora que es siete horas anterior a la hora UTC.For example, the string "2/14/2007 5:32:00 -7:00" defines a time that is seven hours earlier than UTC. Si se omite la diferencia horaria de la representación de cadena de una hora, el análisis devuelve un objeto DateTime con su propiedad Kind establecida en DateTimeKind.Unspecified.If an offset is omitted from the string representation of a time, parsing returns a DateTime object with its Kind property set to DateTimeKind.Unspecified. Si se especifica la diferencia horaria, el análisis devuelve un objeto DateTime con su propiedad Kind establecida en DateTimeKind.Local y su valor ajustado a la zona horaria local del equipo.If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local and its value adjusted to the local time zone of your machine. Puede modificar este comportamiento usando un valor DateTimeStyles con el método de análisis.You can modify this behavior by using a DateTimeStyles value with the parsing method.

El proveedor de formato también se usa para interpretar una fecha numérica ambigua.The format provider is also used to interpret an ambiguous numeric date. No queda claro qué componentes de la fecha representada por la cadena "02/03/04" son el mes, el día y el año.It is not clear which components of the date represented by the string "02/03/04" are the month, day, and year. Los componentes se interpretan según el orden de formatos de fecha similares del proveedor de formato.The components are interpreted according to the order of similar date formats in the format provider.

ParseParse

En el ejemplo siguiente se muestra el uso del método DateTime.Parse para convertir un objeto string en un valor DateTime.The following example illustrates the use of the DateTime.Parse method to convert a string into a DateTime. En este ejemplo se usa la referencia cultural asociada al subproceso actual.This example uses the culture associated with the current thread. Si el objeto CultureInfo asociado a la referencia cultural actual no puede analizar la cadena de entrada, se produce una excepción FormatException.If the CultureInfo associated with the current culture cannot parse the input string, a FormatException is thrown.

Sugerencia

Todos los ejemplos de C# en este artículo se ejecutan en el explorador.All the C# samples in this article run in your browser. Presione el botón Ejecutar para ver el resultado.Press the Run button to see the output. También puede modificarlos para experimentar.You can also edit them to experiment yourself.

Nota

Estos ejemplos están disponibles en el repositorio de documentos de GitHub para ambos lenguajes, C# y VB.These examples are available in the GitHub docs repo for both C# and VB. También puede descargar el proyecto como un archivo comprimido para C# o VB.Or you can download the project as a zipfile for C# or VB.

string dateInput = "Jan 1, 2009";
DateTime parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 12:00:00 AM
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

Además, puede definir explícitamente la referencia cultural cuyas convenciones de formato se utilizan cuando se analiza una cadena.You can also explicitly define the culture whose formatting conventions are used when you parse a string. Especifique uno de los objetos DateTimeFormatInfo estándar devueltos por la propiedad CultureInfo.DateTimeFormat.You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. En el ejemplo siguiente se usa un proveedor de formato para analizar una cadena en alemán como valor DateTime.The following example uses a format provider to parse a German string into a DateTime. Crea un objeto CultureInfo que representa la referencia cultural de-DE.It creates a CultureInfo representing the de-DE culture. El objeto CultureInfo garantiza el análisis correcto de esta cadena concreta.That CultureInfo object ensures successful parsing of this particular string. Esto impide cualquier opción que se encuentre en CurrentCulture de CurrentThread.This precludes whatever setting is in the CurrentCulture of the CurrentThread.

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
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)
' The example displays the following output:
'       6/12/2008 12:00:00 AM

Pero, aunque puede usar sobrecargas del método Parse para especificar proveedores de formato personalizados, el método no admite el análisis de formatos no estándar.However, although you can use overloads of the Parse method to specify custom format providers, the method does not support parsing non-standard formats. Para analizar una fecha y hora expresadas en un formato no estándar, use en su lugar el método ParseExact.To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

En el ejemplo siguiente se usa la enumeración DateTimeStyles para especificar que no debe agregarse la información de fecha y hora actual al valor DateTime en los campos no especificados.The following example uses the DateTimeStyles enumeration to specify that the current date and time information should not be added to the DateTime for unspecified fields.

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
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)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 12:00:00 AM

ParseExactParseExact

Si se ajusta a uno de los patrones de cadena especificados, el método DateTime.ParseExact convierte una cadena en un objeto DateTime.The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. Cuando se pasa a este método una cadena que no tiene uno de las formas especificadas, se genera una excepción FormatException.When a string that is not one of the forms specified is passed to this method, a FormatException is thrown. Puede definirse uno de los especificadores de formato de fecha y hora estándar o una combinación de los especificadores de formato de fecha y hora personalizados.You can specify one of the standard date and time format specifiers or a combination of the custom format specifiers. Con el uso de especificadores de formato personalizados, es posible construir una cadena de reconocimiento personalizada.Using the custom format specifiers, it is possible for you to construct a custom recognition string. Para obtener una explicación de los especificadores, consulte los temas sobre cadenas con formato de fecha y hora estándar y cadenas con formato de fecha y hora personalizado.For an explanation of the specifiers, see the topics on standard date and time format strings and custom date and time format strings.

En el ejemplo siguiente, se pasa al método DateTime.ParseExact un objeto de cadena para que lo analice, seguido de un especificador de formato y luego de un objeto CultureInfo.In the following example, the DateTime.ParseExact method is passed a string object to parse, followed by a format specifier, followed by a CultureInfo object. Este método ParseExact solo puede analizar cadenas que sigan el patrón de fecha larga en la referencia cultural en-US.This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

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
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
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 12:00:00 AM

Cada sobrecarga de los métodos Parse y ParseExact tiene también un parámetro IFormatProvider que proporciona información específica de la referencia cultural sobre el formato de la cadena.Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. Este objeto IFormatProvider es un objeto CultureInfo que representa una referencia cultural estándar o un objeto DateTimeFormatInfo devuelto por la propiedad CultureInfo.DateTimeFormat.This IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. ParseExact usa también una cadena o un argumento de matriz de cadena adicional que define uno o más formatos de fecha y hora personalizados.ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

Vea tambiénSee also