2009-07-28 5 views
3

Nous utilisons MySQL pour stocker des dates. Je cherche à les montrer comme des périodes de temps relatives dans l'interface utilisateur: il y a 2 heures, 3 jours etc. (Comme Twitter le fait pour les mises à jour par exemple)Java: date et heure par rapport à l'heure actuelle (serveur)

Y a-t-il un moyen bien connu d'accomplir ceci, ou devrais-je être créatif avec?

Pour être clair, je veux transformer: 26/07/2009 12h20 -> « 2 jours »

Répondre

1

Je pense que la solution la plus courante consiste à le convertir en timestamp unix (ou équivalent , millisecondes en Java normalement), prenez la différence et commencez à diviser.

time = now - then; 
time /= 1000; /* if milliseconds... */ 
seconds = time % 60; time /= 60; 
minutes = time % 60; time /= 60; 
hours = time % 60; time /= 60; 
days = time % 24; time /= 24; 
weeks = time % 7; time /= 7; 

ou mois (bien que cela commence à devenir compliqué ...), ou ce que vous voulez utiliser.

Amusez-vous.

+0

Même avec des jours, il est difficile car en raison de l'heure d'été, il y a des jours qui ont 23 ou 25 heures. –

+0

@Michael Borgwardt - factoriser en secondes intercalaires et autres causes du problème devient beaucoup plus difficile. –

+0

théoriquement, vous êtes bien sûr correct .. Il est probablement suffisant pour la plupart des utilisations, et ce n'est pas très sujet aux erreurs. – falstro

1

Mon conseil est de lancer votre serveur au UTC puis d'utiliser JodaTime pour effectuer une arithmétique ou une conversion de date entre les fuseaux horaires. Il y a beaucoup plus de calculs arithmétiques à ce jour que l'on ne sait quand on prend en compte le DSL, les secondes intercalaires, les changements de convention, etc. et c'est vraiment la dernière chose que l'on veut faire soi-même.

1

La question est plutôt vague.

En Java, en utilisant JodaTime Date API;

il y a

3 jours:

DateTime date = new DateTime(); 
DateTime threeDA = date.plusDays(-3); 
int daysBetween = Days.daysBetween(dbDate, threeDA).getDays(); 
int monthsBetween = Months.monthsBetween(dbDate, threeDA).getMonths(); 

ou vous pouvez utiliser les JodaTime Période/objets Durée.

En MySQL, utilisez un haut-MySQL Date Function par exemple:

SELECT SUBTIME(SYSDATE(),'3'); -- untested, no MySQL to hand 
SELECT SUBTIME('2007-12-31 23:59:59.999999','3 0:0:0.000000'); 

Pour les différences de date:

SELECT DATEDIFF(columnname, SYSDATE()); -- Days since 
SELECT TIMEDIFF(columnname, SYSDATE()); -- Time since 

En Java, en utilisant le calendrier grégorien:

GregorianCalendar threeDA = new GregorianCalendar(); 
threeDA.add(GregorianCalendar.DAY_OF_YEAR, -3); 
+0

Comment cela convertit-il une fois en 'il y a 3 jours'? Il y a une autre question à propos de «trois jours auparavant», ou est-ce que j'ai mal compris quelque chose ici? – falstro

+0

La question initiale est difficile à comprendre («transformer ces dates dans leur équivalent relatif» n'a pas de sens). Veut-il réellement savoir la différence entre deux dates, dont l'une provient de la DB, et l'autre est la date "il y a 3 jours"? – JeeBee

+0

J'ai modifié mon affichage original. Je voulais dire: J'ai une date absolue dans le DB que je veux montrer comme "il y a 4 jours", "2 heures" etc. dans l'interface utilisateur. – Dan

0

Si vous le pouvez utilisez Java pour la conversion, jetez un oeil à la bibliothèque Joda.

2

Je voudrais jeter un oeil à la bibliothèque Joda pour effectuer ce type d'arithmétique date-heure. Par exemple, vous pouvez créer un Joda Duration puis le convertir en un Period, vous donnant accès à de nombreuses méthodes utiles:

ResultSet rs = ... 
Date dbDate = rs.getDate("Date"); // Get stored time in database. 
long serverTime = System.currentTimeMillis(); // Get current server time. 

// Compute absolute difference between two time-stamps. 
Duration duration = new Duration(Math.abs(serverTime - dbDate.getTime())); 

// Convert to period and make use of getHours(), getMinutes(), etc for display purposes. 
Period period = duration.toPeriod(); 

System.err.println("Hours: " + period.getHours()); 
System.err.println("Minutes: " + period.getMinutes()); // etc. 
0

Du côté MySQL:

CONVERT('date-time-value-here', DATETIME) - NOW() 
2

La méthode API Java standard pour calculs de date est Calendar.add() (qui prend également des paramètres négatifs).

+0

Même question que j'ai posée à JeeBee, comment l'utilisez-vous pour transformer un moment en 'il y a 3 jours'? – falstro

+0

@roe: Calendar.add (Calendar.DAY_OF_MONTH, -3) devrait fonctionner. Il est même utilisé comme exemple dans les javadocs (en utilisant -5 par contre) – Fredrik