wake-up-neo.com

Konvertierung von String in Datum mit Zeitzone

Ich habe eine Zeichenfolge im Muster yyyy-MM-dd hh: mm a Und ich kann das Zeitzonenobjekt separat erhalten, in dem die obige Zeichenfolge das Datum darstellt.

Ich möchte dies in das folgende Format konvertieren JJJJ-MM-TT HH: mm: ss Z

Wie kann ich das machen?

14
John

Sie können SimpleDateFormat mit yyyy-MM-dd HH:mm:ss verwenden und explizit die TimeZone setzen:

public static Date getSomeDate(final String str, final TimeZone tz)
    throws ParseException {
  final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a");
  sdf.setTimeZone(tz);
  return sdf.parse(str);
}

/**
 * @param args
 * @throws IOException
 * @throws InterruptedException
 * @throws ParseException
 */
public static void main(final String[] args) throws ParseException {
  final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
  System.out.println(sdf.format(getSomeDate(
      "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin"))));
  System.out.println(sdf.format(getSomeDate(
      "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago"))));
}

Druckt aus: 

2010-11-17 13:12:00 +0100

2010-11-17 20:12:00 +0100

Update 2010-12-01: Wenn Sie eine spezielle Zeitzone explizit ausdrucken möchten, setzen Sie sie im SimpleDateFormat:

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST"))));

Welche druckt 2010-11-17 13:12:00 +0530

21

tl; dr

LocalDateTime.parse(                        // Parse string as value without time zone and without offset-from-UTC.
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" )
)                                           // Returns a `LocalDateTime` object.
.atZone( ZoneId.of( "America/Montreal" ) )  // Assign time zone, to determine a moment. Returns a `ZonedDateTime` object.
.toInstant()                                // Adjusts from zone to UTC.
.toString()                                 // Generate string: 2017-01-23T17:34:00Z
.replace( "T" , " " )                       // Substitute SPACE for 'T' in middle.
.replace( "Z" , " Z" )                      // Insert SPACE before 'Z'.

Vermeiden Sie alte Datumszeitklassen

Die anderen Antworten verwenden die problematischen alten Datums-/Uhrzeit-Klassen (Date, Calendar usw.), die jetzt veraltet sind und durch die Java.time-Klassen ersetzt werden.

LocalDateTime

Ich habe eine Zeichenfolge im Muster jjjj-MM-tt hh: mm a 

Eine solche Eingabezeichenfolge enthält keine Angabe von UTC-Versatz oder Zeitzone. Also analysieren wir als LocalDateTime

Definieren Sie ein Formatierungsmuster, das mit Ihrer Eingabe übereinstimmt, mit einem DateTimeFormatter -Objekt.

String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" );
LocalDateTime ldt = LocalDateTime.parse( input , f );

ldt.toString (): 2017-01-23T12: 34

Beachten Sie, dass LocalDateTimenicht ein bestimmter Moment ist, sondern nur eine vage Vorstellung von einer Reihe möglicher Momente. Zum Beispiel ist Frankreich einige Minuten nach Mitternacht in Paris noch "gestern" in Montréal, Kanada. Ohne den Kontext einer Zeitzone wie Europe/Paris oder America/Montreal hat es keine Bedeutung, nur "wenige Minuten nach Mitternacht" zu sagen.

ZoneId

und ich kann das Zeitzonenobjekt separat erhalten, in dem die obige Zeichenfolge das Datum darstellt.

Eine Zeitzone wird durch die Klasse ZoneId dargestellt. 

Geben Sie einen richtigen Zeitzonennamen im Format continent/region an, z. B. America/Montreal , Africa/Casablanca oder Pacific/Auckland. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST oder IST, da sie nicht echte Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!). 

ZoneId z = ZoneId.of( "America/Montreal" );

ZonedDateTime

Verwenden Sie ZoneId, um ein ZonedDateTime zu erhalten, bei dem es sich tatsächlich um einen Punkt auf der Timeline handelt, einen bestimmten Moment in der Geschichte.

ZonedDateTime zdt = ldt.atZone( z );

zdt.toString (): 2017-01-23T12: 34-05: 00 [America/Montreal]

Instant

Ich möchte das in das folgende Format konvertieren. JJJJ-MM-TT HH: mm: ss Z

Stellen Sie zunächst fest, dass ein Z-Literalzeichen für Zulu eine Abkürzung ist und UTC bedeutet. Mit anderen Worten, ein Offset-from-UTC von null Stunden, +00:00.

Die Klasse Instant repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs). 

Sie können ein Instant-Objekt aus einem ZonedDateTime extrahieren. 

Instant instant = zdt.toInstant();  // Extracting the same moment but in UTC.

Um eine Zeichenfolge im Standardformat ISO 8601 zu generieren, z. B. 2017-01-22T18:21:13.354Z, rufen Sie toString auf. Das Standardformat hat keine Leerzeichen, verwendet ein T, um das Jahr-Monat-Datum von der Stunde-Minute-Sekunde zu trennen, und fügt das Z kanonisch für einen Offset von Null hinzu. 

String output = instant.toString();

instant.toString (): 2017-01-23T17: 34: 00Z

Ich empfehle nach Möglichkeit, die Standardformate zu verwenden. Wenn Sie darauf bestehen, Leerzeichen in dem angegebenen gewünschten Format zu verwenden, definieren Sie entweder Ihr eigenes Formatierungsmuster in einem DateTimeFormatter -Objekt oder führen Sie einfach eine Zeichenfolgenbearbeitung für die Ausgabe von Instant::toString aus.

String output = instant.toString()
                       .replace( "T" , " " )  // Substitute SPACE for T.
                       .replace( "Z" , " Z" ); // Insert SPACE before Z.

ausgabe: 2017-01-23 17:34:00 Z

Versuchen Sie es mit diesem Code live bei IdeOne.com .


Über Java.time

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

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

Weitere Informationen finden Sie unter Oracle Tutorial . Durchsuchen Sie den Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Wo erhalten Sie die Java.time-Klassen? 

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 einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

9
Basil Bourque

Verwenden Sie SimpleDateFormat

String string1 = "2009-10-10 12:12:12 ";
SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")
sdf.setTimeZone(tz);
Date date = sdf.parse(string1);
5
Jigar Joshi

Zweifellos hat das allgemein verwendete Format die Form 2014-10-05T15:23:01Z (TZ).

Dafür muss man diesen Code verwenden

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String dateInString = "2014-10-05T15:23:01Z";

 try {

     Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000"));
     System.out.println(date);

 } catch (ParseException e) {
     e.printStackTrace();
 }

Seine Ausgabe ist Sun Oct 05 20:53:01 IST 2014

Ich bin mir jedoch nicht sicher, warum wir "All" ersetzen mussten, wenn Sie "replace" nicht hinzufügen.

0
Somum

Erstellen Sie eine neue Instanz von SimpleDateFormat mit Ihrem Datumsmuster. Anschließend können Sie seine parse-Methode aufrufen, um Datumszeichenfolgen in ein Java.util.Date -Objekt zu konvertieren.

0
Robert