2009-07-28 10 views
3

Wir verwenden MySQL, um einige Daten zu speichern. Ich schaue, um diese als relative Zeiträume in der Benutzeroberfläche zu zeigen: 2 Stunden, 3 Tage usw. (Wie Twitter für die Updates zum Beispiel)Java: Datum und Uhrzeit relativ zur aktuellen (Server-) Zeit

Gibt es eine bekannte Möglichkeit, dies zu erreichen, oder sollte ich damit kreativ werden?

Nur klar sein, möchte ich verwandeln: 2009.07.26 00.20 - 'vor 2 Tagen

in der Unix-Zeitstempel die gängigste Lösung zu konvertieren ist es

Antwort

1

Ich denke> (oder gleichwertig , normalerweise Millisekunden in Java), nehmen Sie den Unterschied und beginnen Sie sich zu trennen.

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; 

oder Monate (obwohl, dann wird es zu knifflig ...), oder was auch immer Sie verwenden möchten.

Viel Spaß.

+0

Auch mit Tagen, es ist schwierig, weil aufgrund der Sommerzeit gibt es Tage, die 23 oder 25 Stunden haben. –

+0

@Michael Borgwardt - die Berücksichtigung von Schaltsekunden und ähnlichem führt dazu, dass das Problem erheblich komplizierter wird. –

+0

theoretisch sind Sie natürlich alle korrekt. Es ist wahrscheinlich für die meisten Anwendungen jedoch ausreichend, und es ist nicht sehr fehleranfällig. – falstro

1

Mein Rat ist, führen Sie Ihren Server in UTC und verwenden Sie dann JodaTime, um eine Datumsarithmetik oder Konvertierung zwischen Zeitzonen zu tun.

Es gibt erheblich mehr auf dem neuesten Stand Arithmetik als das Auge, wenn Sie Dinge wie DSL, Sekundensprünge, Konvention Änderungen, etc. und es ist wirklich das letzte, was Sie selbst tun möchten.

1

Die Frage ist eher vage.

In Java mit JodaTime Date API; vor

3 Tage:

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

oder Sie die JodaTime Period/Dauer-Objekte verwenden können.

In MySQL verwenden eine eingebaute in MySQL Date Function zB:

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

Für Datum Unterschiede:

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

In Java, gregorianischen Kalender mit:

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

Wie konvertiert man eine Zeit in eine '3 Tage'? Sich 'vor drei Tagen' in eine Zeit zu verwandeln, ist eine andere Frage, oder habe ich hier etwas falsch verstanden? – falstro

+0

Die ursprüngliche Frage ist schwer zu verstehen ("transformiere diese Daten in ihrer relativen Entsprechung" ist bedeutungslos). Will er eigentlich den Unterschied zwischen zwei Daten wissen, von denen einer aus der Datenbank stammt und der andere das Datum "3 Tage"? – JeeBee

+0

Ich habe meinen ursprünglichen Beitrag bearbeitet. Ich meinte: Ich habe ein absolutes Datum in der DB, das ich als "vor 4 Tagen", "vor 2 Stunden" usw. in der Benutzeroberfläche anzeigen möchte. – Dan

0

Wenn Sie können Verwenden Sie Java für die Konvertierung, werfen Sie einen Blick auf die Joda Bibliothek.

2

Ich würde einen Blick auf die Joda-Bibliothek für die Durchführung dieser Art von Datum-Uhrzeit-Arithmetik werfen. Zum Beispiel könnten Sie eine Joda Duration und wandeln sie dann zu einem Period erstellen, geben Sie zahlreiche nützliche Methoden zugreifen:

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

Auf der MySQL-Seite:

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

Die Java Standard API-Methode für Datumsberechnungen sind Calendar.add() (die auch negative Parameter akzeptiert).

+0

Die selbe Frage wie ich JeeBee gefragt habe, wie benutzt man das um eine Zeit in '3 Tage' zu verwandeln ..? – falstro

+0

@roe: Calendar.add (Calendar.DAY_OF_MONTH, -3) sollte funktionieren. Es wird sogar als Beispiel in den Javadocs verwendet (wobei dort -5 verwendet wird) – Fredrik