it-swarm.com.de

Konvertieren Sie String in ein Kalenderobjekt in Java

Ich bin neu in Java und arbeite normalerweise mit PHP.

Ich versuche diese Zeichenfolge zu konvertieren:

Mo Mar 14 16:02:37 GMT 2011

In ein Kalenderobjekt, damit ich Jahr und Monat wie folgt leicht ziehen kann:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

Wäre es eine schlechte Idee, es manuell zu analysieren? Verwenden Sie eine Teilzeichenfolge-Methode?

Irgendwelche Ratschläge wären dankbar!

145
Doug Molineux
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

hinweis: Stellen Sie Locale entsprechend Ihrer Umgebung/Anforderung ein


Siehe auch

352
Jigar Joshi

Ich denke, es wäre eine schlechte Idee, den Code zu replizieren, der bereits in Klassen wie SimpleDateFormat vorhanden ist.

Andererseits würde ich persönlich vorschlagen, Calendar und Date vollständig zu vermeiden, wenn Sie können, und stattdessen Joda Time als weitaus besser gestaltete Datums- und Zeit-API verwenden. Beispielsweise müssen Sie sich bewusst sein, dass SimpleDateFormatnicht threadsicher ist. Daher benötigen Sie bei jeder Verwendung entweder Thread-Locals, Synchronisierung oder eine neue Instanz. Joda Parser und Formatierer sind threadsicher.

14
Jon Skeet

tl; dr

Der moderne Ansatz verwendet die Klassen Java.time

YearMonth.from(
    ZonedDateTime.parse( 
        "Mon Mar 14 16:02:37 GMT 2011" , 
        DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
     )
).toString()

2011-03

Vermeiden Sie alte Datumszeitklassen

Der moderne Weg ist mit Java.time-Klassen. Die alten Datum-Zeit-Klassen wie Calendar haben sich als schlecht entwickelt, verwirrend und mühsam erwiesen.

Definieren Sie ein benutzerdefiniertes Formatierungsprogramm, das Ihrer Zeichenfolgeingabe entspricht.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

Als ZonedDateTime analysieren.

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

Sie interessieren sich für Jahr und Monat. Die Java.time-Klassen enthalten zu diesem Zweck die Klasse YearMonth.

YearMonth ym = YearMonth.from( zdt );

Bei Bedarf können Sie die Jahres- und Monatszahlen abfragen.

int year = ym.getYear();
int month = ym.getMonthValue();

Die toString-Methode generiert jedoch eine Zeichenfolge im Standardformat ISO 8601 .

String output = ym.toString();

Setze das alles zusammen.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();

Auf die Konsole ausgeben.

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

eingabe: Mo Mar 14 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z [GMT]

ym: 2011-03

Live-Code

Siehe dieser Code wird in IdeOne.com ausgeführt .

Umwandlung

Wenn Sie must über ein Calendar-Objekt verfügen, können Sie mit neuen Methoden, die den alten Klassen hinzugefügt wurden, in ein GregorianCalendar konvertieren.

GregorianCalendar gc = GregorianCalendar.from( zdt );

Über Java.time

Das Framework Java.time ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Legacy Datum-Uhrzeit-Klassen, wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Projekt Joda-Time , jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.

Weitere Informationen finden Sie unter Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Die Spezifikation lautet JSR 310 .

Wo erhalten Sie die Java.time-Klassen? 

  • Java SE 8 und SE 9 und höher
    • Eingebaut. 
    • Teil der Standard-Java-API mit einer mitgelieferten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 und SE 7
    • Ein Großteil der Java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert.
  • Android

Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

12
Basil Bourque

Es muss kein neuer Kalender erstellt werden, SimpleDateFormat verwendet bereits einen Kalender darunter.

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();

(Ich kann noch nicht kommentieren, deshalb habe ich eine neue Antwort erstellt)

9
GoGoris

SimpleDateFormat ist großartig. Beachten Sie, dass sich HH von hh unterscheidet, wenn Sie mit Stunden arbeiten. HH gibt 24 Stunden zurück und hh 12 Stunden.

Zum Beispiel wird das Folgende 12 Stunden zurückgeben:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");

Während dies 24 Stunden zurückgibt:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
5
Philip

Ja, es wäre eine schlechte Praxis, es selbst zu analysieren. Werfen Sie einen Blick auf SimpleDateFormat , der String wird in ein Datum umgewandelt und Sie können das Datum in eine Kalenderinstanz setzen.

3
John Vint

Analysiere eine Zeit mit der Zeitzone, Z in pattern ist für die Zeitzone

String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
    Calendar cal = Calendar.getInstance();
    cal.setTime(sdf.parse(aTime));
    Log.i(TAG, "time = " + cal.getTimeInMillis()); 
} catch (ParseException e) {
    e.printStackTrace();
}

Ausgabe: Gibt die UTC-Zeit zurück

1508899140000

 enter image description here

Wenn wir die Zeitzone nicht in einem Muster wie yyyy-MM-dd'T'HH:mm:ss einstellen. SimpleDateFormat verwendet die Zeitzone, die in Setting eingestellt wurde.

1
Linh

Einfache methode:

public Calendar stringToCalendar(String date, String pattern) throws ParseException {
    String DEFAULT_LOCALE_NAME = "pt";
    String DEFAULT_COUNTRY = "BR";
    Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
    SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
    Date d = format.parse(date);
    Calendar c = getCalendar();
    c.setTime(d);
    return c;
}
0