Tengo fecha y hora en una cadena formateada como esa:
"2011-03-21 13:26" //year-month-day hour:minute
¿Cómo puedo analizarlo System.DateTime
?
Quiero usar funciones como DateTime.Parse()
o DateTime.ParseExact()
si es posible, para poder especificar el formato de la fecha manualmente.
Respuestas:
DateTime.Parse()
intentará averiguar el formato de la fecha dada, y generalmente hace un buen trabajo. Si puede garantizar que las fechas siempre estarán en un formato determinado, puede usarParseExact()
:(Pero tenga en cuenta que generalmente es más seguro usar uno de los métodos TryParse en caso de que una fecha no esté en el formato esperado)
Asegúrese de marcar Cadenas de formato de fecha y hora personalizadas al construir cadenas de formato, especialmente preste atención al número de letras y mayúsculas y minúsculas (es decir, "MM" y "mm" significan cosas muy diferentes).
Otro recurso útil para las cadenas de formato C # es el formato de cadenas en C #
fuente
s
. Por lo tanto, es mejor usar TryParseExcact. He señalado por qué en mi respuesta a continuación.Como explicaré más adelante, siempre favorecería los métodos
TryParse
yTryParseExact
. Debido a que son un poco voluminosos de usar, he escrito un método de extensión que facilita mucho el análisis:A diferencia
Parse
,ParseExact
etc., no arroja una excepción y le permite verificar a través deif (dt.HasValue) { // continue processing } else { // do error handling }
si la conversión fue exitosa (en este caso
dt
tiene un valor al que puede accederdt.Value
) o no (en este caso, lo esnull
).Eso incluso permite usar atajos elegantes como el operador "Elvis"
?.
, por ejemplo:Aquí también puede usar
year.HasValue
para verificar si la conversión tuvo éxito, y si no tuvo éxitoyear
, contendránull
, de lo contrario, la parte del año de la fecha. No se produce ninguna excepción si la conversión falla.Solución: el método de extensión .ToDate ()
Pruébalo en .NetFiddle
Alguna información sobre el código
Quizás se pregunte por qué he usado
InvariantCulture
llamarTryParseExact
: Esto es para forzar a la función a tratar patrones de formato siempre de la misma manera (de lo contrario, por ejemplo, "." Podría interpretarse como separador decimal en inglés mientras es un separador de grupo o un separador de fecha en Alemán). Recordemos que ya hemos consultado las cadenas de formato basadas en la cultura unas pocas líneas antes, así que está bien aquí.Actualización:
.ToDate()
(sin parámetros) ahora se predetermina a todos los patrones de fecha / hora comunes de la cultura actual del hilo.Tenga en cuenta que necesitamos el
result
ydt
juntos, porqueTryParseExact
no permite el usoDateTime?
, que tenemos la intención de devolver. En C # Versión 7 , podría simplificar laToDate
función un poco de la siguiente manera:o, si te gusta aún más corto:
en cuyo caso no necesita las dos declaraciones
DateTime? result = null;
y,DateTime dt;
en absoluto, puede hacerlo en una línea de código. (También se le permitiría escribir enout DateTime dt
lugar deout var dt
si lo prefiere).He simplificado el código aún más mediante el uso de la
params
palabra clave: Ahora usted no necesita el 2 nd método sobrecargado más.Ejemplo de uso
Como puede ver, este ejemplo solo consulta
dt.HasValue
para ver si la conversión fue exitosa o no. Como una ventaja adicional, TryParseExact permite especificar estrictoDateTimeStyles
para que sepa exactamente si se ha pasado o no una cadena de fecha / hora adecuada.Más ejemplos de uso
La función sobrecargada le permite pasar una variedad de formatos válidos utilizados para analizar / convertir fechas como se muestra aquí también (
TryParseExact
directamente lo admite), por ejemploSi solo tiene unos pocos patrones de plantilla, también puede escribir:
Ejemplos avanzados
Puede usar el
??
operador por defecto a un formato a prueba de fallas, por ej.En este caso,
.ToDate()
usaría formatos comunes de fecha de cultura local, y si todos estos fallaran, trataría de usar el formato estándar ISO"yyyy-MM-dd HH:mm:ss"
como alternativa. De esta forma, la función de extensión permite "encadenar" diferentes formatos de reserva fácilmente.Incluso puede usar la extensión en LINQ, pruebe esto (está en el .NetFiddle anterior):
que convertirá las fechas en la matriz sobre la marcha utilizando los patrones y volcarlos a la consola.
Algunos antecedentes sobre TryParseExact
Finalmente, aquí hay algunos comentarios sobre el fondo (es decir, la razón por la que lo he escrito de esta manera):
Estoy prefiriendo TryParseExact en este método de extensión, ya que evita el manejo de excepciones - se puede leer en el artículo de Eric Lippert acerca de las excepciones por las que debe utilizar TryParse en lugar de Parse, lo cito de ese tema: 2)
Lo hace, pero
TryParse
yTryParseExact
ambos son todavía mucho menos cómodo de usar: Te obligan a utilizar una variable no inicializada como unout
parámetro que no debe ser anulable y al mismo tiempo va a convertir es necesario evaluar el valor de retorno booleano - ya sea que usted tiene para usar unaif
instrucción de inmediato o tiene que almacenar el valor de retorno en una variable booleana adicional para que pueda hacer la verificación más tarde. Y no puede usar la variable de destino sin saber si la conversión fue exitosa o no.En la mayoría de los casos, solo desea saber si la conversión fue exitosa o no (y, por supuesto, el valor si fue exitoso) , por lo que sería deseable y mucho más elegante una variable objetivo anulable que mantenga toda la información, porque toda la información es solo almacenado en un solo lugar: eso es consistente y fácil de usar, y mucho menos propenso a errores.
El método de extensión que he escrito hace exactamente eso (también le muestra qué tipo de código tendría que escribir cada vez si no lo va a usar).
Creo que el beneficio
.ToDate(strDateFormat)
es que se ve simple y limpio, tan simple comoDateTime.Parse
se suponía que era el original , pero con la capacidad de verificar si la conversión fue exitosa y sin lanzar excepciones.1) Lo que se quiere decir aquí es que el manejo de excepciones (es decir, un
try { ... } catch(Exception ex) { ...}
bloque), que es necesario cuando se utiliza Parse porque generará una excepción si se analiza una cadena no válida, no solo es innecesario en este caso, sino también molesto, y complicando tu código. TryParse evita todo esto como se muestra en el ejemplo de código que he proporcionado.2) Eric Lippert es un famoso compañero de StackOverflow y estuvo trabajando en Microsoft como desarrollador principal en el equipo compilador de C # durante un par de años.
fuente
¡Mira este enlace para otras cadenas de formato!
fuente
DateTime.Parse () debería funcionar bien para ese formato de cadena. Referencia:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
¿Está lanzando una FormatException para ti?
fuente
Ponga el valor de una cadena legible para humanos en .NET DateTime con un código como este:
fuente
La respuesta simple y directa ->
fuente
También puede usar XmlConvert.ToDateString
Es bueno especificar el tipo de fecha, el código es:
Más detalles sobre las diferentes opciones de análisis http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
fuente
Prueba el siguiente código
fuente