lunes, 21 de septiembre de 2015

Fecha y hora en C++: struct tm vs time_t vs timeval

En C++ existen 3 tipos de datos para representar la fecha y hora. En este artículo vamos a ver las diferencias entre los tres tipos y cómo se realiza la conversión de uno a otros.

struct tm

Estructura que contiene la fecha y hora dividida en los siguientes campos:
  • tm_sec (int)
  • tm_min (int)
  • tm_hour (int)
  • tm_mday (int)
  • tm_mon (int)
  • tm_year (int)
  • tm_wday (int)
  • tm_yday (int)
  • tm_isdst (int)

time_t

Este tipo es realmente un alias del tipo int, ya que time_t almacena el número de segundos transcurridos desde el día 1 de enero de 1970 a las 00:00, lo que comúnmente se conoce como Epoch Unix.

struct timeval

Estructura que puede considerarse un tipo time_t ampliado (con más precisión), puesto que incluye los milisegundos de la hora. La estructura está formada por dos campos:
  • tv_sec (time_t), segundos transcurridos desde el epoch Unix.
  • tv_usec (unsigned int), microsegundos

Crear hora actual

/** time_t **/
time_t ahora_1 = time(0);

/** struct tm **/
struct tm *ahora_2 = localtime(&ahora_1);

/** struct timeval **/
struct timeval ahora_3;
gettimeofday(&ahora_3, NULL);

Conversión entre tipos 

/** struct tm --> time_t **/
struct tm origen;
time_t destino = mktime(&origen);

/** struct tm --> timeval **/
//Convertir a time_t y después a timeval

/** time_t --> struct tm **/
time_t origen;
struct tm *destino1 = localtime(&origen);
struct tm *destino2 = gmtime(&origen); // Igual que localtime pero en formato UTC

/** time_t --> timeval **/
time_t origen;
struct timeval destino;
destino.tv_sec = origen;
destino.tv_usec = 0;

/** struct timeval --> struct tm **/
// Convertir a time_t y después a struct tm

/** struct timeval --> time_t **/
struct timeval origen;
time_t destino = (time_t)origen.tvsec;

viernes, 27 de junio de 2014

Internet: Avisos de cookies

A continuación dejo un enlace a una serie de artículos muy interesantes sobre ese cartelito tan molesto que ahora aparece en la parte de arriba del navegador cuando entramos en la mayoría de las páginas web.

El blog de Paco Pérez Bes: Avisos de cookies I: la información por capas

miércoles, 7 de agosto de 2013

Activar el teclado numérico en Ubuntu 12.04

Después de instalar la versión 12.04 de Ubuntu, me he dado cuenta que el teclado numérico no funciona correctamente a pesar de que está activo (pulsando la tecla Bloq Num). Esto ocurre porque Ubuntu permite el control del ratón a través del teclado numérico. Por tanto, al desactivar esta opción, se recupera la funcionalidad original de estas teclas.

SOLUCIÓN

Vamos a la ventana Aplicaciones > System Tools > Configuración del sistema y en ella vemos la utilidad Acceso universal (en el subapartado Sistema).


Al abrirla, seleccionamos la pestaña "Apuntar y pulsar"y desmarcamos la opción "Controlar el puntero usando el teclado numérico".


Listo.

martes, 8 de enero de 2013

Gestión de logs en Java con log4j

La librería log4j nos permite gestionar los logs de una aplicación Java. Os recomiendo el tutorial Log4j para Creación de Eventos de Log.

Con log4j podemos "trocear" los ficheros de log cuando llegan a un tamaño máximo definido. El tutorial Log4j describe cómo se configura esta opción.

jueves, 15 de noviembre de 2012

Acceso a ficheros XML desde Java

Librería JAX (Java API for XML)


La librería JAX (Java Api for XML Processing) es una implementación del DOM para Java y nos permite manipular ficheros XML. Está incluída en la versión 1.4.2 y posteriores de Java.

Existe un artículo muy completo sobre la utilización de JAX en La Tasca de Xela.

lunes, 12 de noviembre de 2012

JDBC para Access sin DSN

Hasta ahora, para acceder a una base de datos Access desde Java había que crear un ODBC de la siguiente forma:
  1. Herramientas Administrativas > Administrador de Orígines de ODBC > Crear un nuevo Origen
  2. Desde el JDBC, escribir como URL el nombre del DSN.
Es muy incómodo tener que crear un ODBC nuevo en cada máquina que se instale nuestra aplicación Java, por lo que la solución es acceder a la base de datos de la siguiente forma (¡sin crear ODBC!):

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String accessDB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\mi_proyecto\mi_bd.mdb";
Connection conn = DriverManager.getConnection(accessDB, "", "");


Esta solución es válida para cualquier ODBC, no solo para Access. Para acceder a una hoja de cálculo Excel haríamos lo siguiente:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String hojaExcel = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\mi_proyecto\hoja_excel.xls;" + "DriverID=22;READONLY=false";
Connection conn = DriverManager.getConnection(hojaExcel, "", "");


Información extraída de Apuntes de Java.