wake-up-neo.com

Zeitstempel lang in normales Datumsformat konvertieren

In meiner Web-App werden Datum und Uhrzeit einer bestimmten Aktivität eines Benutzers (in der Datenbank) als Zeitstempel Long gespeichert, der bei der Anzeige für den Benutzer in das normale Datums-/Uhrzeitformat konvertiert werden muss. 

(Eigentlich speichert meine Datenbank Cassandra den Zeitstempel, wann eine Spalte in sie geschrieben wurde, als einen langen Wert (Mikrosekunden seit 1970), den ich verwenden werde, um die Zeit der entsprechenden Benutzeraktivität herauszufinden.)

Ich verwende JSF 2.0 (+ Primefaces), von dem ich glaube, dass Konverter hilfreich für diese Konvertierung sind. Oder wie kann ich diese Konvertierungen im besten Fall erreichen? 

17
Rajat Gupta

Lassen Sie mich diese Lösung für Sie vorschlagen. Tun Sie dies in Ihrer verwalteten Bean

public String convertTime(long time){
    Date date = new Date(time);
    Format format = new SimpleDateFormat("yyyy MM dd HH:mm:ss");
    return format.format(date);
}

auf Ihrer JSF-Seite können Sie dies tun (vorausgesetzt, foo ist das Objekt, das Ihre time enthält)

<h:dataTable value="#{myBean.convertTime(myBean.foo.time)}" />

Wenn Sie über mehrere Seiten verfügen, die diese Methode verwenden möchten, können Sie dies in einen abstract class einfügen und Ihre verwaltete Bean diesen abstract class erweitern. 

EDIT: Rückkehrzeit mit TimeZone

leider denke ich, dass SimpleDateFormat die Uhrzeit immer in Ortszeit formatiert, so dass wir SimpleDateFormat nicht mehr verwenden können. Um die Zeit in verschiedenen Zeitzonen anzuzeigen, können wir dies tun

public String convertTimeWithTimeZome(long time){
    Calendar cal = Calendar.getInstance();
    cal.setTimeZone(TimeZone.getTimeZone("UTC"));
    cal.setTimeInMillis(time);
    return (cal.get(Calendar.YEAR) + " " + (cal.get(Calendar.MONTH) + 1) + " " 
            + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":"
            + cal.get(Calendar.MINUTE));

}

Eine bessere Lösung ist die Verwendung von JodaTime. Meiner Meinung nach ist diese API viel besser als der Kalender (leichter, schneller und bietet mehr Funktionalität). Plus Calendar.Month von January ist 0, der Entwickler zwingt, 1 zum Ergebnis hinzuzufügen, und Sie müssen die Zeit selbst formatieren. Mit JodaTime können Sie all dies beheben. Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, JodaTime ist in JDK7 integriert.

55
Thang Pham

Nicht sicher, ob JSF eine integrierte Funktionalität bietet, Sie könnten jedoch den Konstruktor von Java.sql.Date verwenden, um ein Datumsobjekt zu konvertieren: http://download.Oracle.com/javase/1.5.0/docs/api/Java/sql/ Date.html # Datum (lang)

Dann sollten Sie in der Lage sein, von Java SE, Java EE bereitgestellte Funktionen höherer Ebene zur Anzeige und Formatierung des extrahierten Datums zu verwenden. Sie können einen Java.util.Calendar instanziieren und die Uhrzeit explizit einstellen: http://download.Oracle.com/javase/1.5.0/docs/api/Java/util/Calendar.html#setTime(Java.util.Date)

BEARBEITEN: Die JSF-Komponenten sollten sich nicht um die Konvertierung kümmern. Hierfür sollte Ihre Datenzugriffsebene (Persistence Layer) sorgen. Mit anderen Worten, Ihre JSF-Komponenten sollten nicht die long-Attribute behandeln, sondern nur die Date- oder Calendar-Attribute.

1
home

Java.time

    ZoneId usersTimeZone = ZoneId.of("Asia/Tashkent");
    Locale usersLocale = Locale.forLanguageTag("ga-IE");
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(usersLocale);

    long microsSince1970 = 1_512_345_678_901_234L;
    long secondsSince1970 = TimeUnit.MICROSECONDS.toSeconds(microsSince1970);
    long remainingMicros = microsSince1970 - TimeUnit.SECONDS.toMicros(secondsSince1970);
    ZonedDateTime dateTime = Instant.ofEpochSecond(secondsSince1970, 
                    TimeUnit.MICROSECONDS.toNanos(remainingMicros))
            .atZone(usersTimeZone);
    String dateTimeInUsersFormat = dateTime.format(formatter);
    System.out.println(dateTimeInUsersFormat);

Die obigen Snippet-Drucke:

4 Noll 2017 05:01:18

"Noll" ist Gälisch für Dezember, daher sollte dies Ihren Benutzer glücklich machen. Abgesehen davon, dass in Taschkent möglicherweise nur wenige Gälisch sprechende Menschen leben, geben Sie bitte die korrekte Zeitzone und das Gebietsschema des Benutzers an.

Ich nehme an, dass Sie Mikrosekunden aus Ihrer Datenbank erhalten haben. Wenn die zweite Genauigkeit in Ordnung ist, können Sie auf remainingMicros verzichten und einfach das Ein-Argument Instant.ofEpochSecond() verwenden, wodurch der Code um ein paar Zeilen kürzer wird. Da Instant und ZonedDateTime eine Genauigkeit von Nanosekunden unterstützen, habe ich es für richtig erachtet, die volle Genauigkeit Ihres Zeitstempels beizubehalten. Wenn Ihr Zeitstempel in Millisekunden statt in Mikrosekunden lag (was oft der Fall ist), können Sie einfach Instant.ofEpochMilli() verwenden.

Die Antworten mit Date, Calendar und/oder SimpleDateFormat waren gut, als diese Frage vor 7 Jahren gestellt wurde. Heute sind diese Klassen längst veraltet, und wir haben mit Java.time, der modernen Java-API für Datums- und Zeitangaben, so viel bessere Möglichkeiten.

Für die meisten Zwecke empfehle ich, dass Sie die integrierten lokalisierten Formate wie im Code verwenden. Sie können mit der Übergabe von SHORT, LONG oder FULL für den Formatstil experimentieren. Sie können sogar den Formatstil für das Datum und die Tageszeit separat festlegen, indem Sie eine überladene ofLocalizedDateTime-Methode verwenden. Wenn ein bestimmtes Format benötigt wird (dies wurde in eine doppelte Frage gestellt), können Sie Folgendes haben:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss, dd/MM/uuuu");

Verwenden Sie stattdessen dieses Formatierungsprogramm

05:01:18, 12.04.2017

Link:Oracle-Lernprogramm: Date Time Erläuterung der Verwendung von Java.time.

1
Ole V.V.

Ich habe es versucht und für mich gearbeitet.

Date = (long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds
0
sachin

Um führende Nullen vor Stunden, Minuten und Sekunden anzuzeigen, verwenden Sie den geänderten Code. Der Trick hier ist, dass wir Integer in String konvertieren (oder genauer formatieren), so dass sie, wenn anwendbar, führende Nullen anzeigt: 

public String convertTimeWithTimeZome(long time) {
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getTimeZone("UTC"));
        cal.setTimeInMillis(time);
        String curTime = String.format("%02d:%02d:%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
        return curTime;
    }

Ergebnis wäre wie: 00:01:30

0
Irfan Raza