TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
03 de Septiembre de 2010, 05:30:01

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
257111 Mensajes en 28437 Temas por 27916 Usuarios
Último usuario: zororyuzaki
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Todo en microcontroladores PIC (Moderadores: marmatar, MGLSOFT, Modulay, pocher, Sasián, Suky)
| | |-+  Timestamp y Datetime, dos formatos de fecha y un dolor de cabeza.
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: Timestamp y Datetime, dos formatos de fecha y un dolor de cabeza.  (Leído 1655 veces)
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« : 24 de Mayo de 2009, 05:24:50 »

Tengo una pregunta para ustedes que va de fechas, memorias y lo que aquellas ocupan en éstas. No se si tiene una respuesta simple y lo que ocurre es que estoy especialmente obtuso o es que realmente no tan fácil como parece.

El formato Timestamp de Fecha y Hora es el usado en SQL. Es un string ASCII que presenta el formato "aaaa-mm-dd hh:mm:ss". Es muy fácil de leer (entender sólo viéndolo) pero muy ineficaz si tenemos que guardarlo en una memoria EEPROM de PIC por ejemplo. Ocupa 19 bytes (ó 20 si incluimos el \0)

El formato Datetime es un entero de 32 bits y es el usado en muchos lenguajes de alto nivel. Consiste en un simple cómputo del número de segundos que han transcurrido desde cierta echa que se utiliza de referencia. Es muy difícil de leer (entender sólo viéndolo) pero es muy eficaz si tenemos que guardarlo en una memoria EEPROM de PIC por ejemplo. Ocupa sólo 4 bytes.

Cuando nuestro PIC, ayudado por su inestimable amigo el DS1307, debe mostrar o transmitir una Fecha y Hora lo lógico es que lo haga en formato TimeStamp. Cuando lo tiene que almacenar en una EEPROM lo lógico es que lo haga en formato DateTime.

Esto nos lleva a tener que definir una serie de funciones que sean capaces de traducir a ambos formatos la expresión de una misma Fecha y Hora dada por sus respectivos componentes de año, mes, día, hora,minuto y segundo.

Generar un Timestamp dados su componentes es trivial, se trata solo de formatear estas variables con un simple:

Código
GeSHi (css):
  1.   sprintf("%4Lu-%2u-%2u %2u:%2u:%2u",año,mes,día,hora,minuto,segundo);
  2.  

Generar los componentes desde Timestamp es menos trivial, pero casi, dado que solo se trata de recoger los caracters dades su posición y hacerles la correspondiente conversión atoi().

Para generar un DateTime sobre un int32 solo tenemos que inicializar la variable e ir acumulando (sumando) segundos sobre ella según la tabla (simplificado olvidándonos por el momento de los años bisiestos):

1 Año      31536000
1 Mes_31   2678400    (Meses 1,3,5,7,8,10 y12)
1 Mes_30   2592000    (Meses 4,6,9 y 11)
1 Mes_28   2419200    (Mes 2)
1 Día      86400
1 Hora      3600
1 Minuto   60
1 Segundo   1

Cualquier fecha es fácilmente calculable con solo multiplicar y sumar.

Pero en lo que me atasco es en la función simétrica a ésta última. Dada una fecha en formato int32 DateTime obtener sus componentes de año, mes, día, hora,minuto y segundo

El año es fácil ya que sería la parte entera de dividir DateTime por 31536000. Pero a partir de ahí no se por donde tirar. Si a continuación le resto el año obtenido multiplicado también por 31536000 tendría el DateTime sin el año y podría seguir extrayendo componentes.

Si hubiese codificado una fecha de por ejemplo el mes de marzo habría sumado en el Datetime las cantidades de 2678400 (correspondiente a Enero) y 2419200 (correspondiente a Febrero), las de marzo no las hubiese sumado como mes completo sino solo los correspondientes a los días transcurridos de él.

¿Como puedo extraer el dato de que el mes de Enero y el de Febrero han sido añadidos y que por lo tanto estamos en Marco? ¿alguna brillante idea? ¿algún insigne matemático puede decirme: Diego, eres tonto y simple ...?

Gracias amigos.

« Última modificación: 17 de Noviembre de 2009, 03:18:13 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
migsantiago
Moderador Global
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 6836



WWW
« Respuesta #1 : 24 de Mayo de 2009, 06:30:21 »

Hola Diego

Leyendo sobre los objetos DateTime encontré que usan incrementos de 100ns llamados ticks. ¿Dónde leíste que son incrementos de segundos?

http://msdn.microsoft.com/en-us/library/system.datetime.aspx
En línea

RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #2 : 24 de Mayo de 2009, 07:03:20 »

Los de Micro$oft siempre igual ... de ellos me olvido.

TDateTime es un estándar con el que vengo trabajando desde hace mucho años. Es esto: http://www.delphibasics.co.uk/RTL.asp?Name=TDateTime
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
migsantiago
Moderador Global
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 6836



WWW
« Respuesta #3 : 24 de Mayo de 2009, 07:23:55 »

En el link que pones menciona que la fecha se almacena como entero y el tiempo como fracción, ambos en un mismo double. Imagino que es algo como 345.000854, donde 345 es la fecha y los decimales el tiempo. Pero al ser un número de punto flotante desconozco cómo está ensamblado, siendo double es probable que sea un flotante de 64bits... 8 bytes.

Disculpa si estoy escribiendo algo mal, pero en otros lenguajes el tamaño es ése. El single sí usa 32 bits.  Surprised

http://www.delphibasics.co.uk/RTL.asp?Name=Double
En línea

TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 válido! CSS válido!
Página creada en 0.107 segundos con 22 consultas.