web-dev-qa-db-fra.com

Comment incrémenter un horodatage Java.sql.Timest de 14 jours?

J'ai une application qui prend un horodatage comme limite pour la date de début et la date de fin d'une sélection sql, je veux remplir une table de hachage avec des semaines cette année depuis le premier lundi de l'année comme valeurs et le numéro de semaine comme clés . Je trouve qu'il est vraiment difficile de travailler avec des horodatages et je ne me sens pas très bien d'y ajouter 86 400 000 secondes pour incrémenter la journée, car cela ne tient pas compte des jours, heures, secondes bissextiles.

J'ai l'intention d'ajouter 13 jours 23 heures, 59 minutes et 59 secondes pour que je puisse rechercher la date de début dans la carte par semaine comme clé, puis utiliser la date de début pour obtenir la date de fin.

Je cherche donc à obtenir quelque chose comme ça:

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

Les deux premières colonnes de la carte et la dernière étant calculées après la recherche. Comment incrémenter en toute sécurité un horodatage Java.sql.Timest?

24
davidahines

Il convient de noter que 14 jours ne sont pas toujours 14 * 24 * 3600 secondes. Lorsque vous avez l'heure d'été, celle-ci peut être plus courte ou plus longue d'une heure. Historiquement, cela peut être beaucoup plus complexe que cela.

Au lieu de cela, je suggère d'utiliser JodaTime ou le calendrier pour effectuer le calcul en fonction du fuseau horaire.

7
Peter Lawrey
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());

Cela répondra correctement aux transitions heure-heure dans votre fuseau horaire par défaut. Vous pouvez indiquer à la classe Calendar d'utiliser un fuseau horaire différent si nécessaire.

47
Adrian Pronk

Java 8

Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());
4
Anders B
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);
}
2
Admir Sabanovic