61 votes

Meilleur moyen d'obtenir la valeur maximale d'une date en java ?

J'écris une partie de la logique qui nécessite de traiter les dates nulles comme signifiant pour toujours dans le futur (la date en question est une date d'expiration, qui peut ou non exister). Au lieu de mettre en place des cas spéciaux pour une date nulle dans tout le code, je veux simplement convertir null en la date maximale possible. Je ne vois pas de moyen évident d'obtenir une telle valeur sans coder en dur. Quelle est la meilleure façon d'obtenir la valeur maximale de l'implémentation de la date utilisée ?

2 votes

Pour Joda-Time, voir cette question similaire .

0 votes

Il n'y a pas de bonne réponse à cette question car (a) les valeurs maximales et (b) la granularité des valeurs de date-heure varient selon les langages de programmation, les bibliothèques, les bases de données, etc. Je suggère de choisir arbitrairement une valeur codée en dur suffisamment éloignée pour être sûr qu'elle survivra à votre application, mais pas trop éloignée pour ne pas dépasser les limites d'un composant. Quelque chose comme 2666-01-01T00:00:00.0Z .

118voto

cjstehno Points 3913

Essayez

new Date(Long.MAX_VALUE)

ce qui devrait vous donner la valeur de date la plus longue possible en Java.

8 votes

Juste pour me faire l'avocat du diable... cette solution fait toujours une supposition sur l'implémentation de l'objet Date. Que se passe-t-il si mon code est compilé en java version 9 dans un futur lointain, que Date est mis à jour pour pouvoir représenter l'année quattuordecillion, mais que le constructeur qui prend un long est limité à la plage de date originale de 64 bits...

37 votes

Lol... bien, dans ce cas au moins la valeur de la date est si loin dans le futur que de toute façon elle devrait toujours être considérée comme inaccessible. "Sun Aug 17 00:12:55 MST 292278994" sous la version actuelle de Java 6. Je serai impressionné si votre code est toujours là en 292278994 :-)

1 votes

Je suis d'accord avec l'une des autres réponses, ce code devrait être enveloppé dans une autre classe d'aide de quelque sorte, plutôt que d'être utilisé directement.

21voto

Tom Points 13036

Encapsulez la fonctionnalité que vous voulez dans votre propre classe, l'utilisation de Long.MAX_VALUE vous causera très probablement des problèmes.

class ExpirationDate {
    Date expires;

    boolean hasExpiration() {
        return expires == null;
    }

    Date getExpirationDate() {
        return expires;
    } 

    boolean hasExpired(Date date) {
        if (expires == null) {
            return true;
        } else {
            return date.before(expires);
        }
    }

    ...
}

0 votes

+1 ; cela conduira à une vérification beaucoup plus lisible de l'expiration à l'avenir.

0 votes

La logique dont j'ai besoin ne s'applique qu'au code d'une seule méthode, donc je pense que c'est inutile.

0 votes

Je le ferais dans l'autre sens. Dans mon esprit, expires==null signifie qu'il n'y a PAS de délai d'expiration, donc n'importe quelle date serait légale.

7voto

Trevor Harrison Points 1126

+1 aux suggestions de Long.MAX_VALUE. Il semble que cela vous aiderait si vous triez des choses par votre champ de date.

Cependant, au lieu de construire une date à partir d'une grande valeur constante où que vous ayez besoin de la date, utilisez un singleton visible globalement pour contenir une instance de Date qui représente votre valeur spéciale :

class DateUtil
{
  public static final Date NO_EXPIRE = new Date( Long.MAX_VALUE );
}

Vous pouvez alors utiliser une simple comparaison d'identité (mydate == DateUtils.NO_EXPIRE) pour tester si une date particulière correspond à votre cas particulier au lieu d'utiliser obj.equals() ; (c'est-à-dire mydate.equals ( DateUtils.NO_EXPIRE ) ; ).

1 votes

Cela ne vous donnera toujours pas la valeur MAXIMALE de la date, à moins que vous n'incluiez le fuseau horaire UTC !

3 votes

@JarrodRoberson Incorrect, le fuseau horaire n'est pas pertinent. A java.util.Date est toujours en UTC . Cette réponse détermine correctement le dernier moment du temps qui peut être représenté par un objet java.util.Date. Y a-t-il un autre aspect de votre commentaire que je ne comprends pas ?

4voto

Jarrod Roberson Points 32263

Voici ce que je fais :

public static final TimeZone UTC;

// 0001.01.01 12:00:00 AM +0000
public static final Date BEGINNING_OF_TIME;

// new Date(Long.MAX_VALUE) in UTC time zone
public static final Date END_OF_TIME;

static
{
    UTC = TimeZone.getTimeZone("UTC");
    final Calendar c = new GregorianCalendar(UTC);
    c.set(1, 0, 1, 0, 0, 0);
    c.set(Calendar.MILLISECOND, 0);
    BEGINNING_OF_TIME = c.getTime();
    c.setTime(new Date(Long.MAX_VALUE));
    END_OF_TIME = c.getTime();
}

Notez que si le TimeZone n'est PAS UTC, vous obtiendrez des décalages par rapport à la "fin du temps", qui ne seront pas des valeurs maximales. Ces valeurs sont particulièrement utiles pour l'insertion dans les champs de la base de données et pour éviter d'avoir des dates NULL.

0 votes

Cela serait-il vraiment important si toutes les dates avec lesquelles je travaille sont dans le même fuseau horaire ? La formule "new Date(Long.MAX_VALUE)" permet d'obtenir la date maximale pour le fuseau horaire actuel.

0 votes

Si votre TimeZone est UTC, vous n'obtiendrez pas vraiment l'objet Date maximum.

2voto

crowne Points 6002

Avez-vous envisagé d'adopter l'utilisation de Joda Time ?

Il est prévu de l'inclure dans java 7 comme base pour JSR-310

La fonction qui pourrait vous intéresser est la suivante Champ ZeroIsMaxDateTimeField qui remplace les champs nuls par la valeur maximale de ce champ dans la date et l'heure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X