Konvertierung von Java-Zeichenfolgen in Datumsangaben


886

Was ist der beste Weg, um ein Stringim Format '2. Januar 2010' in ein Datein Java zu konvertieren ?

Letztendlich möchte ich den Monat, den Tag und das Jahr als ganze Zahlen aufteilen, damit ich sie verwenden kann

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

um das Datum in die Zeit umzuwandeln.


15
Beachten Sie, dass viele der Antworten Feinheiten wie Gebietsschemas und Zeitzonen ignorieren. Ich würde empfehlen, die Dokumentation für die Klassen Date, Calendar, TimeZone, Locale und SimpleDateFormat genau zu lesen, bevor Sie eine der Klassen verwenden.
Kristopher Johnson

2
Mögliches Duplikat von Convert String to java.util.Date
Ankur

7
Java 8 bietet eine neue Datums- / Uhrzeit-API. Wenn Sie mit Java 8 (oder neuer) , sollten Sie einen Blick auf diese Antwort haben: stackoverflow.com/a/22180505/1115554
micha

2
Alle Setter von Datesind veraltet.
Raedwald

5
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleTextFormatsind jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .
Basil Bourque

Antworten:


1641

Das ist der harte Weg, und diese java.util.DateSetter-Methoden sind seit Java 1.1 (1997) veraltet. Formatieren Sie das Datum einfach SimpleDateFormatmit einem Formatmuster, das mit der Eingabezeichenfolge übereinstimmt .

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

  1. "Januar" ist der Volltextmonat, verwenden Sie also das MMMMMuster dafür
  2. "2" ist der kurze Tag des Monats, verwenden Sie also das dMuster dafür.
  3. "2010" ist das 4-stellige Jahr, verwenden Sie also das yyyyMuster 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 LocaleArguments. Wenn Sie es weglassen, wird das Standardgebietsschema verwendet, das nicht unbedingt Englisch ist, wie im Monatsnamen der Eingabezeichenfolge verwendet. Wenn das Gebietsschema nicht mit der Eingabezeichenfolge übereinstimmt, erhalten Sie verwirrenderweise eine java.text.ParseException, obwohl das Formatmuster gültig erscheint.

Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:

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 zwischen Groß- und Kleinschreibung unterschieden wird und dass textbasierte Muster mit vier oder mehr Zeichen die vollständige Form darstellen. Andernfalls wird eine kurze oder abgekürzte Form verwendet, sofern verfügbar. Also zB MMMMModer mehr ist unnötig.

Hier sind einige Beispiele für gültige SimpleDateFormatMuster zum Parsen einer bestimmten Zeichenfolge bis heute:

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

Ein wichtiger Hinweis ist , dass SimpleDateFormatist nicht Thread - sicher. Mit anderen Worten, Sie sollten es niemals als statische oder Instanzvariable deklarieren und zuweisen und es dann aus verschiedenen Methoden / Threads wiederverwenden. Sie sollten es immer brandneu im lokalen Bereich der Methode erstellen.


Java 8 Update

Wenn Sie sich unter Java 8 oder höher befinden, verwenden Sie DateTimeFormatter(klicken Sie auch hier auf den Link, um alle vordefinierten Formatierer und verfügbaren Formatmuster anzuzeigen. Das Lernprogramm finden Sie hier ). Diese neue API ist von JodaTime inspiriert .

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 Zeitteil enthält, verwenden Sie LocalDateTime#parse(text, formatter)anstelle von LocalDate#parse(text, formatter). Wenn Ihr Formatmuster zufällig auch die Zeitzone enthält, verwenden Sie ZonedDateTime#parse(text, formatter)stattdessen.

Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:

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 vordefinierte Formatierer für die gängigsten Muster gibt. Also statt zB DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);könnten Sie verwenden DateTimeFormatter.RFC_1123_DATE_TIME. Dies ist möglich, weil sie im Gegensatz dazu SimpleDateFormatthreadsicher sind. Sie können also bei Bedarf auch Ihre eigenen definieren.

Für ein bestimmtes Eingabezeichenfolgenformat müssen Sie kein explizites Format verwenden DateTimeFormatter: Ein Standarddatum nach ISO 8601 , wie z. B. 2016-09-26T17: 44: 57Z, kann direkt analysiert werden, LocalDateTime#parse(text)da es bereits den ISO_LOCAL_DATE_TIMEFormatierer verwendet. In ähnlicher Weise wird LocalDate#parse(text)ein ISO-Datum ohne die Zeitkomponente analysiert (siehe ISO_LOCAL_DATE) und ZonedDateTime#parse(text)ein ISO-Datum mit einem hinzugefügten Versatz und einer hinzugefügten Zeitzone (siehe ISO_ZONED_DATE_TIME).


Hallo, in Option O, wie lassen sie drucken UTC+08:00statt GMT+08:00. Ich konnte kein Beispiel bekommen.
TheGamblerRises

Es gibt viele Möglichkeiten, Daten zu analysieren. Hier sind verschiedene Anwendungsfälle von DateFormat.parse
drorw

Hallo BalusC, ich habe eine Zeichenfolge 20-JUN-16 12.00.00.000000000 AM, brauche Hilfe, um diese in Datum umzuwandeln. Deine Hilfe ist sehr Willkommen!!
bemannt

@mannedear oh sorry .. das war mein fehler. Wie auch immer, ich habe die Antwort, die Sie hier sehen können: stackoverflow.com/questions/50982310/…
Queendevelopers

74

Ach ja, wieder die Java Date Diskussion. Für die Datumsmanipulation verwenden wir Date , Calendar , GregorianCalendar und SimpleDateFormat . Verwenden Sie beispielsweise Ihr 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 manipulieren 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));

17
Vergessen Sie nicht, dass Januar
Monatsnummer

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

13
Was ist der Zweck der Trennung von Deklarationen und Definitionen (obwohl dies nicht für die erste Variable erfolgt)?
Peter Mortensen

43

Mit Java 8 erhalten wir eine neue Datums- / Uhrzeit-API ( JSR 310 ).

Die folgende Methode kann verwendet werden, um das Datum in Java 8 zu analysieren, ohne sich auf Joda-Time zu verlassen :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, 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

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

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

Die Liste der Formatierungszeichen aus 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;

Wie funktioniert der Sekundenbruchteil? Wenn ich LocalDateTime date = LocalDateTime.parse ("20140920111713000", DateTimeFormatter.of‌ Pattern ("yyyyMMddHHm‌ mssSSS") verwende; es schlägt fehl, aber wenn ich LocalDateTime date = LocalDateTime.parse ("20140920111713.000", DateTimeFormatter.o‌ fPattern ("yyyyMMddHH‌ mmss.SSS") verwende; es funktioniert
reos

27

Einige der Antworten sind zwar technisch korrekt, aber nicht ratsam.

  • Die Klassen java.util.Date & Calendar sind notorisch problematisch. Vermeiden Sie Fehler in Design und Implementierung. Glücklicherweise haben wir die Wahl zwischen zwei weiteren hervorragenden Datums- und Uhrzeitbibliotheken:
    • Joda-Time
      Diese beliebte kostenlose Open-Source-Bibliothek kann für mehrere 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 neuen Klassen sind von Joda-Time inspiriert und von JSR 310 definiert. Diese Klassen sind in Java 8 integriert. Derzeit läuft ein Projekt, um diese Klassen auf Java 7 zurück zu portieren, aber diese Backportierung wird nicht von unterstützt Orakel.
  • Wie Kristopher Johnson in seinem Kommentar zu der Frage richtig feststellte, ignorieren die anderen Antworten wichtige Fragen von:
    • Uhrzeit
      Datum hat sowohl einen Datumsanteil als auch einen Tageszeitanteil.
    • 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 das, was du willst.
    • Gebietsschema
      Die Sprache des Gebietsschemas gibt an, wie die Wörter (Name des Monats und des Tages) zu interpretieren sind, die beim Parsen auftreten. (Die Antwort von BalusC behandelt dies ordnungsgemäß.) Das Gebietsschema wirkt sich auch auf die Ausgabe einiger Formatierer aus, wenn eine Zeichenfolgendarstellung Ihrer Datums- und Uhrzeitangabe erstellt wird.

Joda-Zeit

Es folgen einige Anmerkungen zur Joda-Zeit.

Zeitzone

In Joda-Time kennt ein DateTime- Objekt seine eigene zugewiesene Zeitzone. Dies steht im Gegensatz zur Klasse java.util.Date , die eine Zeitzone zu haben scheint , dies aber nicht tut.

Beachten Sie im folgenden Beispielcode, wie wir ein Zeitzonenobjekt an den Formatierer übergeben, der die Zeichenfolge analysiert. Diese Zeitzone wird verwendet, um diese Datums- und Uhrzeitangabe als in dieser Zeitzone aufgetreten zu interpretieren. Sie müssen also über die Zeitzone nachdenken und diese bestimmen, die durch diese Zeichenfolgeneingabe dargestellt wird.

Da Ihre Eingabezeichenfolge keinen Zeitanteil enthält, weist Joda-Time den ersten Moment des Tages der angegebenen Zeitzone als Tageszeit zu. Normalerweise bedeutet dies, 00:00:00aber nicht immer, aufgrund der Sommerzeit (DST) oder anderer Anomalien. Übrigens können Sie mit jeder DateTime-Instanz dasselbe tun, indem Sie aufrufen withTimeAtStartOfDay.

Formatierungsmuster

Die im Muster eines Formatierers verwendeten Zeichen ähneln in Joda-Time denen in java.util.Date/Calendar, sind jedoch nicht genau gleich. Lesen Sie das Dokument sorgfältig durch.

Unveränderlichkeit

Wir verwenden normalerweise die unveränderlichen Klassen in Joda-Time. Anstatt ein vorhandenes Datum / Uhrzeit-Objekt zu ändern, rufen wir Methoden auf, die eine neue neue Instanz basierend auf dem anderen Objekt erstellen, wobei die meisten Aspekte kopiert werden, außer wenn Änderungen gewünscht wurden. Ein Beispiel ist der Aufruf withZonein der letzten Zeile unten. Unveränderlichkeit trägt dazu bei, Joda-Time sehr threadsicher zu machen, und kann auch einige Arbeiten klarer machen.

Umwandlung

Sie benötigen java.util.Date-Objekte zur Verwendung mit anderen Klassen / Frameworks, die keine Kenntnisse über Joda-Time-Objekte haben. Glücklicherweise ist es sehr einfach, sich hin und her zu bewegen.

Von einem java.util.Date-Objekt (hier benannt date) zu Joda-Time DateTime wechseln…

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

Von Joda-Time in die andere Richtung zu einem java.util.Date-Objekt gehen…

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 ) );

Beim Laufen…

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

20

Beachten Sie beim Umgang mit der SimpleDateFormat-Klasse, dass Date nicht threadsicher ist und Sie ein einzelnes Date-Objekt nicht für mehrere Threads freigeben können.

Es gibt auch einen großen Unterschied zwischen "m" und "M", wo ein kleiner Fall für Minuten und ein Großbuchstabe für einen Monat verwendet wird. Das gleiche gilt für "d" und "D". Dies kann subtile Fehler verursachen, die oft übersehen werden. Weitere Informationen finden Sie unter Javadoc oder Anleitung zum Konvertieren von Zeichenfolgen in Datumsangaben in Java .


1
Dieser m / M Unterschied hat mich 5 Minuten Frust gekostet, danke, dass du darauf hingewiesen hast :)
Buffalo

Ich bin überrascht, dass dies niemand anderes erwähnt hat. Die Verwendung von SimpleDateFormat in Webanwendungen (oder jeder anderen Multithread-App) ist ein großes Nein-Nein. Bis Java 7 habe ich "FastDateFormat" verwendet.
JackLThornton

18
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.


5
Dies wird Mi Dez 04 00:00:00 GST 2013 als Ausgabe nicht 2013-12-04
Shams

sollte in eine ParseException eingeschlossen werden try / catch
svarog

Dies gibt nicht wie erwartet Werte zurück. Bitte testen Sie vor der Beratung
Lifemoveson

7

Sie können SimpleDateformat verwenden, um die Zeichenfolge auf das Datum zu ändern

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());


1
Die Analysemethode SimpleDateFormat gibt ein Datumsobjekt zurück. Warum dann den Datumskonstruktor verwenden?
Nespapu

6

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

Es ist eine gute Idee, sich für Calendar.getInstance () zu entscheiden, und Sie müssen zwei Daten vergleichen. für ein langes Date gehen.


6

Einfache zwei Formatierer, die wir verwendet haben:

  1. Welches Formatdatum möchten wir?
  2. Welches Formatdatum ist tatsächlich vorhanden?

Wir analysieren das vollständige Format von Datum zu Uhrzeit:

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

Mein bescheidenes Testprogramm. Ich benutze es, um mit dem Formatierer herumzuspielen und lange Daten nachzuschlagen, die ich in Protokolldateien finde (aber wer hat sie dort abgelegt ...).

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

2

Quelle Link -

Für Android

Calendar.getInstance (). GetTime () gibt

Thu Jul 26 15:54:13 GMT+05:30 2018

Verwenden

String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);

0

Konvertierung von Zeichenfolge in Datum:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }

-1

Versuche dies

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.