2011-09-16 16 views
14

Tengo una aplicación que toma una marca de tiempo como límite para la fecha de inicio y finalización de una selección sql, quiero llenar un hashmap con semanas este año desde el primer lunes del año como los valores y el número de semana como las llaves. Me resulta muy difícil trabajar con marcas de tiempo y no me siento muy bien si agrego 86,400,000 segundos para aumentar el día, ya que esto no tiene en cuenta los días bisiestos, las horas, los segundos.¿Cómo incremento un java.sql.Timestamp en 14 días?

Planeo agregar 13 días, 23 horas, 59 minutos y 59 segundos para poder buscar la fecha de inicio en el mapa por semana como la clave, luego usar la fecha de inicio para obtener la fecha de finalización.

Así que estoy buscando para tratar de obtener algo como esto:

Week startDate    endDate 
1  2011-01-03 00:00:00 2011-01-16 23:59:59 
2  2011-01-17 00:00:00 2011-01-30 23:59:59 

Con las dos primeras columnas de la Mapa y el último se calcularán después de mirar hacia arriba. ¿Cómo puedo incrementar de forma segura una java.sql.Timestamp?

+0

El único problema que tendría que preocuparse es de los segundos intercalares, y los que ocurren una vez cada pocos años. Si su programa se hubiera estado ejecutando desde 1970, estaría desactivado en un total de 24 segundos. Su plan de agregar 86.4M segundos es perfectamente viable. – corsiKa

+0

¿Qué tal si trabajas con Calendar o Joda? http://joda-time.sourceforge.net/ –

+0

Supongo que la verdadera pregunta es ... ¿has identificado esto como un bloqueador para tu aplicación? Si no lo has hecho, solo hazlo. Si es un problema, se presentará y podrá abordarlo en ese momento. – corsiKa

Respuesta

7

Vale la pena señalar que 14 días no siempre son 14 * 24 * 3600 segundos. Cuando tiene horario de verano, esto puede ser una hora más corta o más larga. Históricamente puede ser mucho más complejo que eso.

En cambio, sugeriría usar JodaTime o el Calendario para realizar el cálculo dependiente de la zona horaria.

+1

¿Eso realmente importaría? Siempre que use UTC no se encontrará con este problema. – corsiKa

+1

SQL generalmente no usa UTC. Especialmente si no lo encuentras explícitamente. –

+0

Si está utilizando GMT o cualquier zona horaria sin horario de verano, no hay problema. Quería señalar que 14 días pueden contener un día que no tiene 24 horas. Java no admite segundos intercalares como GMT, pero UTC sí lo hace. ;) –

36
java.sql.Timestamp ts = ... 
Calendar cal = Calendar.getInstance(); 
cal.setTime(ts); 
cal.add(Calendar.DAY_OF_WEEK, 14); 
ts.setTime(cal.getTime().getTime()); // or 
ts = new Timestamp(cal.getTime().getTime()); 

Esto atender correctamente para las transiciones en tiempo de verano en su zona horaria por defecto. Puede indicarle a la clase Calendario que use una Zona horaria diferente si es necesario.

+0

Esto solo contabilizará correctamente los ahorros de luz diurna si su VM tiene una lista actualizada. JodaTime permite el uso de una fuente estándar para esto: supuestamente las actualizaciones de VM para esto han sido históricamente lentas. –

+1

Sospecho que una de las razones de las actualizaciones lentas es que los usuarios de "enterprisy" permanecen en jvms que tienen al menos 10 años de antigüedad ... Por otro lado, la mayoría de los SO se las arreglan para mantener una lista de información de zona horaria que tiene toda la información necesario. La jre realmente debería usar eso. En mi computadora portátil Linux, parece estar configurado hasta 2499 ... – KarlP

2
private Long dayToMiliseconds(int days){ 
    Long result = Long.valueOf(days * 24 * 60 * 60 * 1000); 
    return result; 
} 

public Timestamp addDays(int days, Timestamp t1) throws Exception{ 
    if(days < 0){ 
     throw new Exception("Day in wrong format."); 
    } 
    Long miliseconds = dayToMiliseconds(days); 
    return new Timestamp(t1.getTime() + miliseconds); 
} 
1

Java 8

Timestamp old; 
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC")); 
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant()); 
Cuestiones relacionadas