Mi campo de fecha y hora solo se analizará si el formateador está configurado en el formato de hora universal y la fecha y hora ya está en ese formato. ¿Es este un comportamiento esperado o debería poder tomar cualquier cadena de fecha adecuada y formatearla en un formato diferente? Si es así, ¿cómo se resuelve esto?

Esto funciona si la entrada de fecha ya está en formato universal:

[FieldTrim(TrimMode.Both)]
[FieldConverter(ConverterKind.Date, "yyyy-MM-dd hh:mm")]
public DateTime Transaction_date; //where Transaction_date CSV value = "2019-01-02 6:00"

Estos no funcionan:

[FieldTrim(TrimMode.Both)]
[FieldConverter(ConverterKind.Date, "yyyy-MM-dd hh:mm")]
public DateTime Transaction_date; //where Transaction_date = "01-02-2019 6:00"

Esta es la excepción para el código anterior:

"Mensaje": "Se ha producido un error", "ExceptionMessage": "Error al convertir '01-02-2009 06:00 'a escribir:' DateTime '. Usando el formato:' aaaa-MM-dd hh: mm '", "ExceptionType": "FileHelpers.ConvertException", "StackTrace": "en FileHelpers.ConvertHelpers.DateTimeConverter.StringToField (String from) \ r \ n en FileHelpers.FieldBase.AssignFromString (ExtractedInfo fieldString, línea LineInfo) \ r \ n en FileHelpers.FieldBase.ExtractFieldInfoValue ( \ n en FileHelpers.RecordOperations.StringToRecord (registro de objeto, línea de LineInfo, valores de Object []) \ r \ n en FileHelpers.FileHelperEngine 1.ReadStreamAsList(TextReader reader, Int32 maxRecords, DataTable dt)\r\n at FileHelpers.FileHelperEngine 1.ReadStream (lector de TextReader, Int32 maxRecords) \ r \ n en FileHelpers. FileHelperEngine`1.ReadString (Fuente de cadena, Int32 maxRecords) ...

[FieldTrim(TrimMode.Both)]
[FieldConverter(ConverterKind.Date, "MM-dd-yyyy hh:mm")]
public DateTime Transaction_date; //where Transaction_date CSV value = "2019-01-02 6:00" Note that formatter is not universal date format

Esta es la excepción para el fragmento anterior:

"Mensaje": "Se ha producido un error", "ExceptionMessage": "Error al convertir '2009-01-02 06:00' a escribir: 'DateTime'. Usando el formato: 'MM-dd-aaaa hh: mm'", "ExceptionType": "FileHelpers.ConvertException", "StackTrace": "en FileHelpers.ConvertHelpers.DateTimeConverter.StringToField (String from) \ r \ n en FileHelpers.FieldBase.AssignFromString (ExtractedInfo fieldString, línea LineInfo) \ r \ n en FileHelpers.FieldBase.ExtractFieldInfoValue ( \ n en FileHelpers.RecordOperations.StringToRecord (registro de objeto, línea de LineInfo, valores de Object []) \ r \ n en FileHelpers.FileHelperEngine 1.ReadStreamAsList(TextReader reader, Int32 maxRecords, DataTable dt)\r\n at FileHelpers.FileHelperEngine 1.ReadStream (lector de TextReader, Int32 maxRecords) \ r \ n en FileHelpers. FileHelperEngine`1.ReadString (Fuente de cadena, Int32 maxRecords) ...

0
Hoodlum 18 oct. 2019 a las 01:46

1 respuesta

La mejor respuesta

Según estos documentos, puede utilizar ConverterKind.DateMultiFormat para permitir hasta tres formatos.

[FieldConverter(ConverterKind.DateMultiFormat, "yyyy-MM-dd HH:mm", "MM-dd-yyyy HH:mm")]

Tenga en cuenta que tenía hh en su código. Eso es para las horas de un reloj de 12 horas que van de 01 a 12. No es muy útil sin especificar también el tt para el indicador de meridiem am / pm. Probablemente te refieres a HH, que corresponde a las horas de un reloj de 24 horas que van de 00 a 23. Los tokens de formato distinguen entre mayúsculas y minúsculas.

Finalmente, los formatos que especifique se pasan a DateTime.TryParseExact en el código fuente aquí. Por lo tanto, cualquiera de se pueden utilizar las cadenas de formato de fecha y hora .NET.

Con respecto a tu pregunta:

... debería poder tomar cualquier cadena de fecha adecuada ...

No. Aceptará solo los formatos que proporciones.

Tenga en cuenta que las cadenas de fechas pueden ser ambiguas cuando la cultura no está clara. Por ejemplo, 01/02/2019 sería el 2 de enero en los EE. UU., Pero se interpretaría como el 1 de febrero en gran parte del resto del mundo.

2
Matt Johnson-Pint 17 oct. 2019 a las 23:05