Frage Java-String-zu-Datum-Konvertierung


Was ist der beste Weg, um ein String im Format "2. Januar 2010" zu a Date in Java?

Letztendlich möchte ich den Monat, den Tag und das Jahr als Ganzzahlen austeilen, damit ich sie nutzen kann

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

um das Datum in Zeit umzuwandeln.


735
2017-11-18 15:53


Ursprung


Antworten:


Das ist der harte Weg, und diese java.util.Date Setter-Methoden sind seit Java 1.1 (1997) veraltet. Formatieren Sie das Datum einfach mit SimpleDateFormat Verwenden eines Formatmusters, das der Eingabezeichenfolge entspricht.

In Ihrem speziellen Fall von "2. Januar 2010" als Eingabezeichenfolge:

  1. "Januar" ist der Volltextmonat, also benutze die MMMM Muster dafür
  2. "2" ist der kurze Tag des Monats, also benutze die d Muster dafür.
  3. "2010" ist das vierstellige Jahr, verwenden Sie also die yyyy Muster dafür.

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Beachten Sie die Wichtigkeit des Expliziten Locale Streit. Wenn Sie es weglassen, wird es das verwenden Standardgebietsschema Dies ist nicht unbedingt Englisch, wie es im Monatsnamen der Eingabezeichenfolge verwendet wird. Wenn das Gebietsschema nicht mit der Eingabezeichenfolge übereinstimmt, erhalten Sie verwirrenderweise eine java.text.ParseException obwohl das Formatmuster gültig zu sein scheint.

Hier ist ein Auszug von Relevanz von das Javadoc, alle verfügbaren Formatmuster auflisten:

Letter  Date or Time Component  Presentation        Examples
------  ----------------------  ------------------  -------------------------------------
G       Era designator          Text                AD
y       Year                    Year                1996; 96
Y       Week year               Year                2009; 09
M/L     Month in year           Month               July; Jul; 07
w       Week in year            Number              27
W       Week in month           Number              2
D       Day in year             Number              189
d       Day in month            Number              10
F       Day of week in month    Number              2
E       Day in week             Text                Tuesday; Tue
u       Day number of week      Number              1
a       Am/pm marker            Text                PM
H       Hour in day (0-23)      Number              0
k       Hour in day (1-24)      Number              24
K       Hour in am/pm (0-11)    Number              0
h       Hour in am/pm (1-12)    Number              12
m       Minute in hour          Number              30
s       Second in minute        Number              55
S       Millisecond             Number              978
z       Time zone               General time zone   Pacific Standard Time; PST; GMT-08:00
Z       Time zone               RFC 822 time zone   -0800
X       Time zone               ISO 8601 time zone  -08; -0800; -08:00

Beachten Sie, dass bei den Mustern die Groß- / Kleinschreibung beachtet wird und dass textbasierte Muster mit vier oder mehr Zeichen die vollständige Form darstellen. Andernfalls wird eine Kurz- oder Kurzform verwendet, sofern verfügbar. So z.B. MMMMM oder mehr ist unnötig.

Hier sind einige Beispiele für gültig SimpleDateFormat Muster zum Analysieren einer gegebenen Zeichenfolge bis zum heutigen Tag:

Input string                            Pattern
------------------------------------    ----------------------------
2001.07.04 AD at 12:08:56 PDT           yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01                         EEE, MMM d, ''yy
12:08 PM                                h:mm a
12 o'clock PM, Pacific Daylight Time    hh 'o''clock' a, zzzz
0:08 PM, PDT                            K:mm a, z
02001.July.04 AD 12:08 PM               yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700          EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700                       yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700            yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00           yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3                              YYYY-'W'ww-u

Eine wichtige Anmerkung ist das SimpleDateFormat ist nicht fadensicher. Mit anderen Worten, Sie sollten es nie als statische oder Instanzvariable deklarieren und zuweisen und es dann von anderen Methoden / Threads wiederverwenden. Sie sollten es immer neu innerhalb des lokalen Bereichs der Methode erstellen.


Java 8 Update

Wenn Sie auf Java 8 oder neuer sind, dann verwenden Sie DateTimeFormatter (Klicken Sie auch hier, um alle vordefinierten Formatierer und verfügbaren Formatmuster zu sehen; Das Tutorial ist hier verfügbar). Diese neue API ist inspiriert von JodaTime.

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

Hinweis: Wenn Ihr Formatmuster auch den Zeitanteil enthält, verwenden Sie LocalDateTime#parse(text, formatter) Anstatt von LocalDate#parse(text, formatter). Und wenn Ihr Formatmuster auch die Zeitzone enthält, verwenden Sie ZonedDateTime#parse(text, formatter) stattdessen.

Hier ist ein Auszug von Relevanz von das Javadoc, alle verfügbaren Formatmuster auflisten:

Symbol  Meaning                     Presentation  Examples
------  --------------------------  ------------  ----------------------------------------------
G       era                         text          AD; Anno Domini; A
u       year                        year          2004; 04
y       year-of-era                 year          2004; 04
D       day-of-year                 number        189
M/L     month-of-year               number/text   7; 07; Jul; July; J
d       day-of-month                number        10

Q/q     quarter-of-year             number/text   3; 03; Q3; 3rd quarter
Y       week-based-year             year          1996; 96
w       week-of-week-based-year     number        27
W       week-of-month               number        4
E       day-of-week                 text          Tue; Tuesday; T
e/c     localized day-of-week       number/text   2; 02; Tue; Tuesday; T
F       week-of-month               number        3

a       am-pm-of-day                text          PM
h       clock-hour-of-am-pm (1-12)  number        12
K       hour-of-am-pm (0-11)        number        0
k       clock-hour-of-am-pm (1-24)  number        0

H       hour-of-day (0-23)          number        0
m       minute-of-hour              number        30
s       second-of-minute            number        55
S       fraction-of-second          fraction      978
A       milli-of-day                number        1234
n       nano-of-second              number        987654321
N       nano-of-day                 number        1234000000

V       time-zone ID                zone-id       America/Los_Angeles; Z; -08:30
z       time-zone name              zone-name     Pacific Standard Time; PST
O       localized zone-offset       offset-O      GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X      Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z      +0000; -0800; -08:00;

Beachten Sie, dass es mehrere hat vordefinierte Formatierer für die beliebtesten Muster. Also anstelle von z.B. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, Du könntest benutzen DateTimeFormatter.RFC_1123_DATE_TIME. Dies ist möglich, weil sie im Gegenteil zu SimpleDateFormat, fadensicher. Sie könnten somit auch selbst bestimmen, falls erforderlich.

Für ein bestimmtes Eingabezeichenfolgenformat müssen Sie keine explizite Zeichenfolge verwenden DateTimeFormatter: ein Standard ISO 8601 Datum, wie 2016-09-26T17: 44: 57Z, kann direkt mit analysiert werden LocalDateTime#parse(text) wie es schon benutzt ISO_LOCAL_DATE_TIME Formatierer. Ähnlich, LocalDate#parse(text) Analysiert ein ISO-Datum ohne die Zeitkomponente (siehe ISO_LOCAL_DATE), und ZonedDateTime#parse(text) analysiert ein ISO-Datum mit einem Offset und einer Zeitzone, die hinzugefügt werden (siehe ISO_ZONED_DATE_TIME).


1411
2017-11-18 15:55



Ah ja, die Java Date Diskussion, nochmal. Um mit der Datumsmanipulation umzugehen, benutzen wir Datum, Kalender, Gregorianischer Kalender, und SimpleDateFormat. Zum Beispiel mit Ihrem Januar-Datum als Eingabe:

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

Dann können Sie das mit etwas wie:

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

62
2017-11-19 03:27



String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

36
2018-01-15 07:02



Mit Java 8 erhalten wir eine neue Date / Time API (JSR 310).

Der folgende Weg kann verwendet werden, um das Datum in Java 8 zu analysieren, ohne darauf angewiesen zu sein Joda-Zeit:

String str = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LokalesDatum ist die Standard Java 8-Klasse für die Darstellung eines Datums (ohne Zeitangabe). Wenn Sie Werte analysieren möchten, die Datums- und Zeitinformationen enthalten, sollten Sie sie verwenden LocalDateTime. Für Werte mit Zeitzonen verwenden ZonedDateTime. Beide bieten eine parse() ähnliche Methode LocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

Die Liste formatiert Zeichen von DateTimeFormatter Javadoc:

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

29
2018-03-04 18:56



Während einige der Antworten technisch korrekt sind, sind sie nicht ratsam.

  • Die Klassen java.util.Date & Calendar sind bekanntermaßen mühsam. Vermeiden Sie sie aufgrund von Fehlern in Design und Implementierung. Zum Glück haben wir zwei weitere ausgezeichnete Datum-Zeit-Bibliotheken zur Auswahl:
    • Joda-Zeit
      Diese beliebte kostenlose Open-Source-Bibliothek kann in verschiedenen Java-Versionen verwendet werden. Viele Beispiele für seine Verwendung finden Sie in StackOverflow. Wenn Sie einige davon lesen, werden Sie schnell auf den neuesten Stand gebracht.
    • java.time. * Paket
      Diese neue Klasse von Klassen wurde von Joda-Time inspiriert und von JSR 310 definiert. Diese Klassen sind in Java 8 integriert. Ein Projekt ist im Begriff, diese Klassen nach Java 7 zu portieren, aber Backporting wird nicht von Oracle unterstützt.
  • Wie Kristopher Johnson in seinem Kommentar zu der Frage richtig angemerkt hat, ignorieren die anderen Antworten wichtige Fragen:
    • Uhrzeit
      Datum hat sowohl einen Datumsteil als auch einen Tageszeitteil)
    • Zeitzone
      Der Beginn eines Tages hängt von der Zeitzone ab. Wenn Sie keine Zeitzone angeben, wird die Standardzeitzone der JVM angewendet. Das bedeutet, dass sich das Verhalten Ihres Codes ändern kann, wenn er auf anderen Computern oder mit einer geänderten Zeitzoneneinstellung ausgeführt wird. Wahrscheinlich nicht was du willst.
    • Gebietsschema
      Die Sprache des Gebietsschemas gibt an, wie die während der Analyse gefundenen Wörter (Name des Monats und des Tages) interpretiert werden. (Das Antwort von BalusC handhabt dies richtig.) Außerdem beeinflusst das Gebietsschema die Ausgabe einiger Formatierer beim Generieren einer Zeichenfolgendarstellung von Datum und Uhrzeit.

Joda-Zeit

Ein paar Notizen über Joda-Time folgen.

Zeitzone

Im Joda-Zeit, ein Terminzeit Objekt kennt seine eigene zugewiesene Zeitzone. Dies stellt die Klasse java.util.Date gegenüber, die scheint eine Zeitzone haben, tut es aber nicht.

Beachten Sie im folgenden Beispielcode, wie wir ein Zeitzonenobjekt an den Formatierer übergeben, der die Zeichenfolge analysiert. Diese Zeitzone wird verwendet, um das Datum und die Uhrzeit als in dieser Zeitzone aufgetreten zu interpretieren. Sie müssen also über die Zeitzone nachdenken, die durch diese Zeichenfolgeneingabe repräsentiert wird.

Da Sie in Ihrer Eingabe keinen Zeitabschnitt haben, weist Joda-Time den ersten Moment des Tages der angegebenen Zeitzone als Tageszeit zu. Normalerweise bedeutet das 00:00:00 aber nicht immer, wegen Sommerzeit (DST) oder andere Anomalien. Übrigens können Sie das gleiche für jede DateTime-Instanz tun, indem Sie aufrufen withTimeAtStartOfDay.

Formatierungsmuster

Die in einem Formatierungsmuster verwendeten Zeichen sind in Joda-Time denen in java.util.Date/Calendar ähnlich, aber nicht genau dieselben. Lesen Sie das Dokument sorgfältig durch.

Unveränderlichkeit

Normalerweise benutzen wir die unveränderlichen Klassen in Joda-Time. Anstatt ein vorhandenes Date-Time-Objekt zu ändern, rufen wir Methoden auf, die eine neue Instanz auf der Basis des anderen Objekts erstellen, wobei die meisten Aspekte kopiert werden, außer wenn Änderungen gewünscht wurden. Ein Beispiel ist der Aufruf an withZone in der letzten Zeile unten. Unveränderlichkeit hilft, Joda-Time sehr thread-sicher zu machen, und kann auch einige Arbeit klarer machen.

Umwandlung

Sie benötigen java.util.Date-Objekte für die Verwendung mit anderen Klassen / Framework, die nicht über Joda-Time-Objekte wissen. Glücklicherweise ist es sehr einfach, sich hin und her zu bewegen.

Ausgehend von einem java.util.Date-Objekt (hier benannt date) zu Joda-Time DateTime ...

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Die andere Richtung von Joda-Time zu einem java.util.Date-Objekt ...

java.util.Date date = dateTime.toDate();

Beispielcode

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

Wenn es läuft ...

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

20
2018-02-13 08:22



Beim Umgang mit der SimpleDateFormat-Klasse ist es wichtig, daran zu denken, dass Date nicht Thread-sicher ist und Sie kein einzelnes Date-Objekt mit mehreren Threads teilen können.

Außerdem gibt es einen großen Unterschied zwischen "m" und "M", wobei für Minuten ein kleiner Fall verwendet wird und für einen Monat ein Großbuchstabe verwendet wird. Das gleiche gilt für "d" und "D". Dies kann zu kleinen Fehlern führen, die oft übersehen werden. Sehen Javadoc oder Anleitung zum Konvertieren von String nach Datum in Java für mehr Details.


16
2017-12-02 01:48



    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date;
    try {
        date = dateFormat.parse("2013-12-4");
        System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

        String output = dateFormat.format(date);
        System.out.println(output); // 2013-12-04
    } 
    catch (ParseException e) {
        e.printStackTrace();
    }

Es funktioniert gut für mich.


13
2017-12-04 12:46



Außerdem ist SimpleDateFormat nicht mit einigen der clientseitigen Technologien verfügbar, wie z GWT.

Es ist eine gute Idee, nach Calendar.getInstance () zu suchen, und Ihre Anforderung besteht darin, zwei Daten zu vergleichen. für ein langes Date gehen.


5
2017-12-10 16:16



Einfache zwei Formatierer, die wir benutzt haben:

  1. Welches Formatdatum wollen wir?
  2. Welches Format Datum ist tatsächlich vorhanden?

Wir analysieren das gesamte Datum auf das Zeitformat:

date="2016-05-06 16:40:32";

public static String setDateParsing(String date) throws ParseException {

    // This is the format date we want
    DateFormat mSDF = new SimpleDateFormat("hh:mm a");

    // This format date is actually present
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    return mSDF.format(formatter.parse(date));
}

5
2018-05-06 10:12



Mein bescheidenes Testprogramm. Ich benutze es, um mit dem Formatierer herumzuspielen und lange Daten zu suchen, die ich in Log-Dateien finde (aber wer hat sie dort hingelegt ...).

Mein Testprogramm:

package be.test.package.time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class TimeWork {

    public static void main(String[] args) {    

        TimeZone timezone = TimeZone.getTimeZone("UTC");

        List<Long> longs = new ArrayList<>();
        List<String> strings = new ArrayList<>();

        //Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
        //Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        formatter.setTimeZone(timezone);

        Date now = new Date();

        //Test dates
        strings.add(formatter.format(now));
        strings.add("01-01-1970 00:00:00.000");
        strings.add("01-01-1970 00:00:01.000");
        strings.add("01-01-1970 00:01:00.000");
        strings.add("01-01-1970 01:00:00.000");
        strings.add("01-01-1970 10:00:00.000");
        strings.add("01-01-1970 12:00:00.000");
        strings.add("01-01-1970 24:00:00.000");
        strings.add("02-01-1970 00:00:00.000");
        strings.add("01-01-1971 00:00:00.000");
        strings.add("01-01-2014 00:00:00.000");
        strings.add("31-12-1969 23:59:59.000");
        strings.add("31-12-1969 23:59:00.000");
        strings.add("31-12-1969 23:00:00.000");

        //Test data
        longs.add(now.getTime());
        longs.add(-1L);
        longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
        longs.add(1L);
        longs.add(1000L);
        longs.add(60000L);
        longs.add(3600000L);
        longs.add(36000000L);
        longs.add(43200000L);
        longs.add(86400000L);
        longs.add(31536000000L);
        longs.add(1388534400000L);
        longs.add(7260000L);
        longs.add(1417706084037L);
        longs.add(-7260000L);

        System.out.println("===== String to long =====");

        //Show the long value of the date
        for (String string: strings) {
            try {
                Date date = formatter.parse(string);
                System.out.println("Formated date : " + string + " = Long = " + date.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        System.out.println("===== Long to String =====");

        //Show the date behind the long
        for (Long lo : longs) {
            Date date = new Date(lo);
            String string = formatter.format(date);
            System.out.println("Formated date : " + string + " = Long = " + lo);        
        }
    }
}

Testergebnisse:

===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000

4
2017-12-04 16:34