2016-07-16 6 views
1

Ich habe versucht, einen Zeitstempel zu Datum und Datum zu Zeitstempelkonverter in Java zu erstellen. Die Konverterlogik funktioniert perfekt und ich habe sie in einem Konsolenfenster angezeigt. Das funktioniert aber nicht richtig.Zeitstempelkonverter

Wenn ich diesen Zeitstempel in mein Konsolenfenster eingeben:

1449946800000 (I get this timestamp from my calendar web plugin) 

Date : 13.10.2016 20:00:00 (Timezone "Europe/Berlin) = 1476381600000 

Zum ersten Mal rufe ich einen Mehtod, die das Zeitstempel-Format wie oben erforderlich.

Bei Übereinstimmung ruft die Methode logic.convertedTime (xx) auf. (Siehe Klasse convertLogic)

Hier ist mein Code:

public class convertLogic { 

/** TimeZone-Support**/ 
private static final String TIMEZONEBERLIN = "Europe/Berlin"; 


/** 
* convertedTime: <br> 
* input timestamp to convert into date <br> 
* <strong>...</strong> 
* @param timestamp 
*/ 
public void convertedTime(long timestamp) { 

    TimeZone timeZoneBerlin = TimeZone.getTimeZone(TIMEZONEBERLIN); 
    // System.out.println(timeZoneBerlin.getDisplayName()); 
    // System.out.println(timeZoneBerlin.getID()); 
    // System.out.println(timeZoneBerlin.getOffset(System.currentTimeMillis())); 

    Calendar myDate = GregorianCalendar.getInstance(); 
    myDate.setTimeZone(timeZoneBerlin); 
    myDate.setTimeInMillis(timestamp * 1000); 

    int month = myDate.get(Calendar.MONTH) + 1; 
    int second = Integer.parseInt(leadingZero(myDate.get(Calendar.SECOND))); 


    System.out.println("Datum: " + myDate.get(Calendar.DAY_OF_MONTH) + "." + month + "." + myDate.get(Calendar.YEAR) 
      + " " + myDate.get(Calendar.HOUR_OF_DAY) + ":" + myDate.get(Calendar.MINUTE) + ":" 
      + second); 

} 



/** 
* leadingZero for 2 digit values 
* 
* @param value 
* @return String 
*/ 
private static String leadingZero(int value) { 

    int testValue = value; 

    if (testValue < 10) { 

     return "0" + value; 
    } else { 

     return value + ""; 
    } 

} 

Und ich folgende Ausgabe:

Datum: 13.10.2016 20:0:0 

Aber ich will oder ich brauche nur Nullen von der Stunde, Minuten und Sekunden wie dies:

13.10.2016 20:00:00 

Kennt jemand eine Lösung?

Vielen Dank im Voraus!

+0

Warum nennen Sie nicht die Methode 'leadingZero'? Haben Sie versucht, die Methode zu verwenden, die Sie haben? –

Antwort

1

Fix: Rufen Sie Ihre leadingZero Methode

führende Null Sie effektiv entfernen Sie es Nach der Zugabe.

Nach dem Auffüllen mit einer führenden Null rufen Sie Integer.parseInt. Dieser Anruf erzeugt eine Nummer, eine int. Das Standardformat, das beim Konvertieren in einen String verwendet wird, hat keine führende Null.

Ändern Sie den Datentyp second in String.

Ebenso übergeben Sie das Ergebnis myDate.get(Calendar.HOUR_OF_DAY) an Ihre leadingZero Methode.

merkwürdige Ergebnisse

Ich verstehe nicht, Ihre Eingaben und Ergebnisse. Wenn 1449946800000 eine Anzahl von Millisekunden seit Beginn der Epoche der ersten Minute des Jahres 1970 UTC ist, ist, dass ein Datum Zeit im Jahr 2015 nicht 2016:

  • 2015-12-12T19:00:00Z
  • 2015-12-12T20:00+01:00[Europe/Berlin]

java.time

Sie arbeiten zu hart. Verwenden Sie ein Datum-Zeit-Framework für diese Arbeit.

Das java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die alten problematischen Datum-Zeit-Klassen wie java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Weitere Informationen finden Sie unter Oracle Tutorial. Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen.

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport und weiter in ThreeTenABP auf Android angepasst.

Beispielcode

zuerst Ihre Zählung-from-Epoche in ein einen Moment auf der Timeline in UTC mit einer Auflösung Instant Objekt übersetzt bis zu nanoseconds darstellt.

long input = 1_449_946_800_000L; 
Instant instant = Instant.ofEpochMilli (input); 

eine Zeitzone Nehmen Europe/Berlin. A ZoneId repräsentiert die Zeitzone. Wir verwenden das, um ein Objekt ZonedDateTime zu generieren.

Erstellen Sie einen String, der den Wert unseres Objekts ZonedDateTime darstellt.

Sie müssen kein Formatierungsmuster definieren. Die Klasse kann eine Datum-Uhrzeit-Darstellung automatisch in eine menschliche Sprache und kulturelle Normen eingrenzen, die durch Locale definiert sind. Ihr gewünschtes Format ist bereits als das in Deutschland gebräuchliche Format mittlerer Länge bekannt.

Verstehen, dass ein time zone und ein Locale verschieden und getrennt sind. Man passt die Bedeutung von Datum und Uhrzeit an eine Wanduhrzeit eines geografischen Gebiets auf dem Globus an. Der andere übersetzt Namen von Tag oder Monat und bestimmt Komma gegen Punkt und andere solche Probleme.

Locale locale = Locale.GERMANY; 
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM).withLocale (locale); 
String output = zdt.format (formatter); 

Dump zur Konsole.

System.out.println ("input: " + input + " | instant: " + instant + " | zdt: " + zdt + " | output: " + output); 

Eingang: 1449946800000 | sofort: 2015-12-12T19: 00: 00Z | zdt: 2015-12-12T20: 00 + 01: 00 [Europa/Berlin] | Ausgabe: 12.12.2015 20:00:00

0

DateFormat könnte dein Freund sein, den Code (oder DateTimeFormatter bei Java 8) zu vereinfachen.