So konvertieren Sie eine TimeZone dateTime in ein UTC-Datum in JAVA [Duplikat]
Ich muss die Datums- und Uhrzeitangabe verwenden, die ich vom Benutzer erhalten habe, und diese Uhrzeit von der angegebenen Uhrzeit in UTC konvertieren. Im Moment funktionieren alle Lösungen, aber nicht so, wie ich es brauchte. Erstens wird es in die Zeitzone konvertiert, aber ich möchte es zunächst nicht konvertieren. Ich muss diese Zeitzone auf mein Datum einstellen und diese Zeit dann in UTC konvertieren. Im Moment zeigt jede Lösung, dass ich Datum und Uhrzeit übergeben muss, und dann werde ich Datum und Uhrzeit mit der von mir angegebenen Zeitzone aktualisiert und dann in die UTC konvertiert. Das war nicht meine Frage.
Mein Benutzer sendet mir Datum und Uhrzeit einer beliebigen Zeitzone, und mein Server wird in der UTC-Zeitzone ausgeführt. Ich werde die Zonen-ID vom Frontend erhalten. Ich möchte dieses Datum und die Uhrzeit in UTC konvertieren und mit meinen anderen Bedingungen überprüfen. Es ist möglich, dass ich in einer Anfrage UTC-7-Zeit bekomme und nach der nächsten Anfrage UTC + 5: 30. Daher sollte die gesamte Zeit in UTC konvertiert werden, und ich kann die Zeitzone nicht auf das Datum einstellen.
Ich wollte die spezifische Zeitzone auf Datum einstellen, und ich erhalte das Datum und die Uhrzeit dieser Zeitzone, kann aber die genaue Zeitzone nicht einstellen. Hier füge ich meinen Code hinzu. Bitte sagen Sie mir, wo ich falsch liege:
Calendar laCalendar = Calendar.getInstance();
laCalendar.set(2020, 8, 14, 00, 00);
Date losAngelesDate = laCalendar.getTime();
System.out.println("LA Date1===>" + losAngelesDate);
SimpleDateFormat simpleTimeFormatForUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormatForUSA.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String americaDateString = simpleTimeFormatForUSA.format(laCalendar.getTime());
SimpleDateFormat dateFormatUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
losAngelesDate = dateFormatUSA.parse(americaDateString);
System.out.println("LA Date2===>" + losAngelesDate);
Date utcDate = losAngelesDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(utcDate);
TimeZone timeZone = TimeZone.getTimeZone("UTC");
SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormat.setTimeZone(timeZone);
String utcTime = simpleTimeFormat.format(calendar.getTime());
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
utcDate = dateFormat.parse(utcTime);
System.out.println("UTC date====>" + utcDate);
Und meine Ausgabe ist
LA Date1===>Mon Sep 14 00:00:56 UTC 2020
LA Date2===>Sun Sep 13 17:00:00 UTC 2020
UTC date====>Sun Sep 13 17:00:00 UTC 2020
Hier können Sie sehen, dass meine DateTime konvertiert wurde, aber die Zeitzone immer noch UTC ist und ich wollte das aktualisieren.
Antworten
Hier ist, wie ich es mit Java 8 Date / Time APIs schreiben würde.
public static void main(String[] args)
{
System.out.println("UTC");
toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("UTC")));
System.out.println("America/Los_Angeles");
toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles")));
}
public static void toTimeZone(Date date, TimeZone timeZone)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Instant epochMillisInstant = Instant.ofEpochMilli(calendar.getTimeInMillis());
LocalDateTime localDateTime = LocalDateTime.ofInstant(epochMillisInstant, ZoneId.systemDefault());
ZonedDateTime dateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
ZonedDateTime dateTimeWithTimeZone = dateTimeToConvert.withZoneSameInstant(timeZone.toZoneId());
String formattedDateForNewTimeZone = dateTimeWithTimeZone.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
System.out.println(formattedDateForNewTimeZone);
}
Verwenden von Just Java 8-Datums- / Zeit-APIs - Kürzere Version
public static void main(String[] args) {
System.out.println("UTC");
toTimeZone(LocalDateTime.now(),"UTC");
System.out.println("America/Los_Angeles");
toTimeZone(LocalDateTime.now(),"America/Los_Angeles");
}
private static void toTimeZone(LocalDateTime localDateTime, String timeZone) {
ZonedDateTime localDateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
ZonedDateTime zonedDateTime = localDateTimeToConvert.withZoneSameInstant(ZoneId.of(timeZone));
String formattedDateForNewTimeZone = zonedDateTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
System.out.println(formattedDateForNewTimeZone);
}
Bevor Sie den Kalender in ein Datum konvertieren, stellen Sie die Zeitzone nach Ihren Wünschen ein.
Zum Beispiel:
import java.util.Calendar;
import java.util.TimeZone;
public class Timezone{
public static void main(String []args){
Calendar laCalendar = Calendar.getInstance();
TimeZone timezone = TimeZone.getTimeZone("UTC");
laCalendar.set(2020, 8, 14, 00, 00);
laCalendar.setTimeZone(timezone);
java.util.Date losAngelesDate = laCalendar.getTime();
System.out.println(losAngelesDate.toString());
}
}