none
automapper fecha c RRS feed

  • Pregunta

  • hola foro :

    tengo un problema es la continuacion de este hilo . 

    Aplicacion web service con automaapper tengo problemas con la conversion de string a datetime? en una cultura determinada en un cliente. da error en la conversion
    el codigo es el siguiente

     public class NullDateTimeTypeConverter : TypeConverter<string, DateTime?>
        {
            protected override DateTime? ConvertCore(string source)
            {
                if (source == string.Empty)
                    return null;
                else
                {
                    DateTime result;
              
                    return DateTime.TryParse(source, out result) ? (DateTime?)result : null;
                }
            }
        }
    
    uso asi en el codigo principal:
    Mapper.CreateMap<string, DateTime?>().ConvertUsing<NullDateTimeTypeConverter>()

    Explico :  cambie la configuracion de mi maquina a ingles estados unidos como tiene el cliente( MM/dd/yyyy) , 
    cuando tenia en el dto un caso con esta fecha de vigencia: 21/03/2015 17:50:51.
    el codigo de arriba DateTime.TryParse me devolvio false es decir el dto cn el campo  fecha vigencia me devuelve null para esa fecha, y no deberia ser asi.

    Luego, si cambio a español argentina la config me devuelve true y el codigo de arribaa me devuelve la fecha ok  pero  en formato asi : 3/21/2015 5:50:51 PM estoy probando con el Wcf test client.


    Si el cliente tiene la configuracion estados unidos me convendria trabajar con esa configuracion o la argentina porque el proxy del cliente  el dtociente en el campo 
    fecha de vigencia me lo va a cambiar al formato  estos unidos  cdo el ws envie informacion y va a saltar error?

    gracias desde ya.


    viernes, 3 de abril de 2015 23:11

Respuestas

  • Hola sebastian viga

    Me sumo a la recomendación de Leandro, debería definir un formato común... no hay que pensar mucho para eso esta la UTC (mas que nada para que tengas dolores de cabeza!) pero si nos ponemos a pensar para que la hora siempre sea la misma hora (no importa en que pais se visualice ni en que formato... si el evento fue a las 3 de la tarde horario universal de un dia... es a esa hora y punto je! (luego se visualizara dependiendo de la cultura de a UI que la visualiza) con esto quiero decir que también guardes en formato UTC. Es decir... recomendación "no culturalices la fecha para guardarla" (linda frase para tatuarse)

    Es decir, cuando envías la hora de cualquier cliente (no importa en que planeta esta, lease en que servidor y en que zona horaria) Envía la hora en el formato universal

    Te puede ayudar ToUniversalTime 

    Así no tendrías que pasar mas parámetros solo definir siempre el formato común. 
    PEro si solo tienes 1 cliente,  sabes que siempre viene en tal formato bueno.. ya tienes allí tu cultura (salvo que no este configurado correctamente del otro lado y tome la cultura del servidor y no de la configurada en la app)

    Espero que te sirva de ayuda o guía


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja


    sábado, 4 de abril de 2015 19:39
  • >>y no funciono para una fecha de este tipo   21/03/2015 17:50:51. me sigue devolviendo null

    si defienes la cultura como en-US y pasas una fecha como 21/03/2015 es mas que logico que no va funcionar porque no esta respectando el formato MM/dd/yyyy que espera la cultura en-US

    la cuestion es que si defines que la cultura vendra en formato MM/dd/yyyy la envies en ese formato, o quizas pruebes si funciona el

    CultureInfo.InvariantCulture

    para definir el format en la conversion

    si esto no funciona debes fijar un formato y enviar siempre de esa forma el formato de la fecha

    >>entonces cdo viene la debo convertir a detetime con cultura español argentina pero el resultadoe de la fecha es en cultura usa 03/21.  La conversion es en español y como muestra es estados unidos ? no logro comprender bien

    no se si entendi del todo el planteo que realizas

    pero si envias la fecha con formato es-Es o es-Ar el cual sigue el formato dd/MM/yyyy entonces convierte usando esa cultura

    no entiendo que tiene que ver la cultura en-US, define una cultura de intercambio y usa siempre esa, si el cliente te la envia en otro formato avisale que no reconocera la fecha y que se adapte cuando invoque el servicio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    domingo, 5 de abril de 2015 1:48

Todas las respuestas

  • >>en el campo  fecha de vigencia me lo va a cambiar al formato  estos unidos  cdo el ws envie informacion y va a saltar error?

    si al cultura no coincide con la fecha que envias en la conversion el TryParse() no va a generar error sino que no convertira la fecha ya que devolver un false, obteniendo un datetime null de respuesta

    igualmente creo que deberias fijar el formato en que se enviara la fecha, si esperas la fecha en una cultura el web service deberia enviarlo en ese formato

    ----

    tambien podrias usar

    TryParse(String, IFormatProvider, DateTimeStyles, DateTime)

    al definir el format provider puedes indicar la cultura

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de abril de 2015 23:38
  • gracias leandro .

    Si te entendi bien me recomendas que  el weservice castee  la fecha con la cultura estados unidos(que es la que tiene el cliente)
    entonces puse mi maquina con la configuracion del cliente con  fecha estados unidos.( MM/dd/yyyy)

    y hice este codigo
       DateTime result;
                    CultureInfo culture;
                    DateTimeStyles styles;
                    culture = CultureInfo.CreateSpecificCulture("en-US");
                    styles = DateTimeStyles.None;
                   
                    return DateTime.TryParse(source,culture, styles, out result) ? (DateTime?)result : null;

    y no funciono para una fecha de este tipo   21/03/2015 17:50:51. me sigue devolviendo null

    Luego probe culture = CultureInfo.CreateSpecificCulture("es-AR") y tambien con la configuracion de la maquina en estados unidos  y me devuelve la fecha y pero con el formato estados unidos. 
    y creo que esta bien que sea asi porque recorde que en la base de datos del cliente hay una funcion que pone en formato español en string dd/mm/yyyy
    entonces cdo viene la debo convertir a detetime con cultura español argentina pero el resultadoe de la fecha es en cultura usa 03/21.  La conversion es en español y como muestra es estados unidos ? no logro comprender bien








    sábado, 4 de abril de 2015 1:01
  • Hola sebastian viga

    Me sumo a la recomendación de Leandro, debería definir un formato común... no hay que pensar mucho para eso esta la UTC (mas que nada para que tengas dolores de cabeza!) pero si nos ponemos a pensar para que la hora siempre sea la misma hora (no importa en que pais se visualice ni en que formato... si el evento fue a las 3 de la tarde horario universal de un dia... es a esa hora y punto je! (luego se visualizara dependiendo de la cultura de a UI que la visualiza) con esto quiero decir que también guardes en formato UTC. Es decir... recomendación "no culturalices la fecha para guardarla" (linda frase para tatuarse)

    Es decir, cuando envías la hora de cualquier cliente (no importa en que planeta esta, lease en que servidor y en que zona horaria) Envía la hora en el formato universal

    Te puede ayudar ToUniversalTime 

    Así no tendrías que pasar mas parámetros solo definir siempre el formato común. 
    PEro si solo tienes 1 cliente,  sabes que siempre viene en tal formato bueno.. ya tienes allí tu cultura (salvo que no este configurado correctamente del otro lado y tome la cultura del servidor y no de la configurada en la app)

    Espero que te sirva de ayuda o guía


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja


    sábado, 4 de abril de 2015 19:39
  • >>y no funciono para una fecha de este tipo   21/03/2015 17:50:51. me sigue devolviendo null

    si defienes la cultura como en-US y pasas una fecha como 21/03/2015 es mas que logico que no va funcionar porque no esta respectando el formato MM/dd/yyyy que espera la cultura en-US

    la cuestion es que si defines que la cultura vendra en formato MM/dd/yyyy la envies en ese formato, o quizas pruebes si funciona el

    CultureInfo.InvariantCulture

    para definir el format en la conversion

    si esto no funciona debes fijar un formato y enviar siempre de esa forma el formato de la fecha

    >>entonces cdo viene la debo convertir a detetime con cultura español argentina pero el resultadoe de la fecha es en cultura usa 03/21.  La conversion es en español y como muestra es estados unidos ? no logro comprender bien

    no se si entendi del todo el planteo que realizas

    pero si envias la fecha con formato es-Es o es-Ar el cual sigue el formato dd/MM/yyyy entonces convierte usando esa cultura

    no entiendo que tiene que ver la cultura en-US, define una cultura de intercambio y usa siempre esa, si el cliente te la envia en otro formato avisale que no reconocera la fecha y que se adapte cuando invoque el servicio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    domingo, 5 de abril de 2015 1:48