<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://eliteya.spaces.live.com/mmm2008-07-17_13.29/rsspretty.aspx?rssquery=en-US;http%3a%2f%2feliteya.spaces.live.com%2fcategory%2fVisual%2bBasic%2b6%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>El Iteya: Visual Basic 6</title><description /><link>http://eliteya.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catVisual%2bBasic%2b6</link><language>en-US</language><pubDate>Sun, 22 Jun 2008 00:38:43 GMT</pubDate><lastBuildDate>Sun, 22 Jun 2008 00:38:43 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://eliteya.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-8969555353333628037</live:id><live:alias>eliteya</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>La fecha se me da vuelta</title><link>http://eliteya.spaces.live.com/Blog/cns!8385BCEDCB58837B!196.entry</link><description>&lt;p&gt;&lt;strike&gt;Creo haber escuchado esto aproximadamente 100 veces (por día) en los últimos 8 años. He buscado las mil y una formas de explicar este tema y siempre aparece una nueva forma de explicarlo, dependiendo que tan compleja sea la mente del receptor, pero creo que ésta es la más simple.&lt;/strike&gt; &lt;p&gt;&lt;strike&gt;Rompamos un paradigma que se pueden haber creado: &amp;quot;Los tipos de datos fecha (DATE) no tienen vida propia, por ende no se dan vuelta solos como cualquier ser humano cuando duerme&amp;quot;.&lt;/strike&gt; &lt;p&gt;Los tipos de datos Date son en definitiva un &lt;strong&gt;número&lt;/strong&gt;. Donde su parte entera indica la cantidad de días transcurridos desde una fecha origen, y su parte decimal indica los segundos transcurridos para ese día. Si por ejemplo hacemos el siguiente código: &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Private Sub &lt;/font&gt;Form_Load()&lt;br&gt;        MsgBox &lt;font color="#0000ff"&gt;CDbl&lt;/font&gt;(Now)&lt;br&gt;&lt;font color="#0000ff"&gt;End Sub&lt;/font&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#000000"&gt;Obtenemos un message box donde nos muestra la fecha de hoy, en formato de número. Tenemos que tener siempre presente que la fecha es un número que nace a raíz de un número inicial. Cuando uno ve la fecha en pantalla la puede ver en diferentes formatos dd/mm/yyyy hh:mm:ss o yyyy/mm/dd hh:mm:ss o mm/dd/yyyy hh:mm:ss etc. pero esto es sólo una cuestión de formato de presentación, sólo eso. &lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;El problema sucede cuando se realizan conversiones &lt;strong&gt;implícitas&lt;/strong&gt; &lt;strike&gt;no deseadas &lt;/strike&gt;de tipos de datos. Visual Basic permite la conversión de tipos basándose en la configuración regional, cosa bastante odiosa por cierto. Para manejar una fecha correctamente debemos tener bien claro cómo funcionan las conversiones de tipos de datos y hacer las mismas de forma &lt;strong&gt;explicita&lt;/strong&gt;.&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;Una conversión implícita sería como se muestra a continuación:&lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Private Sub &lt;/font&gt;Form_Load()&lt;br&gt;&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; mFecha &lt;font color="#0000ff"&gt;As Date&lt;br&gt;&lt;/font&gt;       mFecha = &lt;font color="#0000ff"&gt;CDate&lt;/font&gt;(text1.Text) &lt;font color="#008040"&gt;&lt;font size=1&gt;'La &amp;quot;fecha&amp;quot; de tipo string se convierte a date&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;End Sub&lt;/font&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#000000"&gt;Esto funciona siempre y cuando la configuración regional coincida con el formato en el que se está ingresando la fecha o peor aún puede que se ingrese mal el formato en el textbox y que &lt;strike&gt;funcione &lt;/strike&gt;igual de mal, siempre y cuando no ingresemos un mes que no existe (13, 14, etc.).&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;La explicación de esto es muy sencilla: supongamos que la &amp;quot;fecha&amp;quot; ingresada en el textbox es &amp;quot;01/01/2006&amp;quot;, cuando se quiere convertir a Date, el Runtime se pregunta cual es el mes y cual es el día !? en este caso poco importa ya que son iguales, pero la misma pregunta se hace cuando ingresamos &amp;quot;01/02/2006&amp;quot; y acá es donde se produce el problema. En base a la configuración regional decide cual es el mes el &amp;quot;01&amp;quot; ó el &amp;quot;02&amp;quot; y puede no coincidir con lo que nosotros queríamos que decidiera, porque no hicimos una conversión &lt;strong&gt;explicita&lt;/strong&gt; indicándole como se debe interpretar el string que ingresamos como fecha.&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;Este problema sucede generalmente cuando estamos trabajando con arquitecturas distribuidas, un cliente donde se capturan los datos, un servidor de aplicaciones donde se procesan e interpretan y un repositorio donde los guardamos. Supongamos que para conectar el Cliente con el servidor de aplicaciones utilizamos un web service, lo que implica que tengamos que enviar el string (de nuestra fecha) dentro de un XML. Por otro lado supongamos que el componente (que está publicado como web servide) recibe un parámetro fecha del tipo date, yo recomiendo hacer lo siguiente:&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;&lt;strong&gt;Primero&lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;Capturamos la fecha en formato string en el Cliente (Front End) incluyendo una leyenda de como se debe ingresar, por ejemplo dd/mm/yyyy. Luego parseamos el string y utilizando la función DateSerial devolvemos un Date. Este date debe viajar dentro de un XML (es un string), por ello recomiendo convertirlo a Double y reemplazar la coma por el punto, para evitar nuevamente malas interpretaciones de configuración regional en el servidor, veamos:&lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Private Sub &lt;/font&gt;Command1_Click()&lt;br&gt;&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; mFecha&lt;font color="#0000ff"&gt; As Date&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; varFecha &lt;font color="#0000ff"&gt;As Variant&lt;br&gt;Dim&lt;/font&gt; mFechaInnerXml &lt;font color="#0000ff"&gt;As String &lt;/font&gt; &lt;p&gt;&lt;font color="#008040"&gt;'Text1.text: indica con una leyenda el Formato de Fecha esperado dd/mm/yyyy hh:mm:ss&lt;br&gt;&lt;/font&gt;varFecha = Split(Text1.Text, &amp;quot;/&amp;quot;) &lt;font color="#008040"&gt;'Parseamos la fecha&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;If &lt;/font&gt;IsArray(varFecha) &lt;font color="#0000ff"&gt;Then&lt;/font&gt; &lt;font color="#008040"&gt;'verificamos si no estaba vacía&lt;br&gt;&lt;/font&gt;   mFecha = DateSerial(varFecha(2), varFecha(1), varFecha(0)) &lt;font color="#008040"&gt;'Esto devuelve un Date&lt;/font&gt;&lt;br&gt;   mFechaInnerXml = Replace(&lt;font color="#0000ff"&gt;CDbl&lt;/font&gt;(mFecha), &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;) 'Cuando tiene horas y minutos&lt;br&gt;   MsgBox mFechaInnerXml&lt;br&gt;&lt;font color="#0000ff"&gt;End If&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;End Sub&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;&lt;strong&gt;Segundo&lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;El web services, recibe la fecha dentro del xml y debe convertirla nuevamente a date, ya que el objeto que instancia en su cuerpo, recibe como parámetro un tipo de dato Date. Para ello deberá utilizar una función que se comporte como el &lt;strong&gt;Val(String) as Double &lt;/strong&gt;de Visual Basic. Esta función recibe un String que contiene un número con &amp;quot;.&amp;quot; como separador decimal y devuelve un Double. Luego deberá convertirlo a Date, ahora si utilizando el Cdate(). Entonces tenemos algo como esto:&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;mFecha = &lt;font color="#0000ff"&gt;CDate&lt;/font&gt;(Val(mFechaInnerXml))&lt;/font&gt; &lt;p&gt;&lt;font color="#000000"&gt;Ahora si puedo ejecutar el componente y pasarle el tipo de dato fecha para que este lo interprete:&lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; mObjeto &lt;font color="#0000ff"&gt;As&lt;/font&gt; Componente.Clase&lt;br&gt;&lt;font color="#0000ff"&gt;Set&lt;/font&gt; mObjeto = Server.CreateObject(&amp;quot;Componente.Clase&amp;quot;)&lt;br&gt;mObjeto.GetForDate (mFecha) &lt;p&gt;Espero, que esto haya podido aclarar un poco como es el funcionamiento de los tipos de datos Date, las conversiones implícitas vs. explícitas y los problemas que pueden acarrear los usos laxos de este tipo de funcionalidades.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8969555353333628037&amp;page=RSS%3a+La+fecha+se+me+da+vuelta&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eliteya.spaces.live.com&amp;amp;GT1=eliteya"&gt;</description><comments>http://eliteya.spaces.live.com/Blog/cns!8385BCEDCB58837B!196.entry#comment</comments><guid isPermaLink="true">http://eliteya.spaces.live.com/Blog/cns!8385BCEDCB58837B!196.entry</guid><pubDate>Sun, 17 Dec 2006 23:46:51 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eliteya.spaces.live.com/blog/cns!8385BCEDCB58837B!196/comments/feed.rss</wfw:commentRss><wfw:comment>http://eliteya.spaces.live.com/Blog/cns!8385BCEDCB58837B!196.entry#comment</wfw:comment><dcterms:modified>2006-12-17T23:46:51Z</dcterms:modified></item></channel></rss>