将具有给定偏移量的日期时间转换为 UTC Java
Convert A DateTime With Given Offset to UTC Java
鉴于我有字符串“2019-11-05/23:00”和偏移量“+07:00”,
我将如何在 Java(8) 中将其转换为 LocalDateTime UTC。
我的当前代码
@GetMapping("postDate/{date}")
public void testPost(@RequestParam("timezone") String timeZone, @PathVariable String date) {
String format = "yyyy-MM-dd-HH:mm";
String offset = timeZone;
System.out.println(date);
LocalDateTime timeWithOffset = LocalDateTime.parse(date,
DateTimeFormatter.ofPattern(format));
System.out.println("\n\n\n" + timeWithOffset + "\n\n\n");
// Cant Figure Out to get LocalDateTime timeInUTC
}
邮递员的请求
http://localhost:8080/postDate/2019-11-05-23:00?timezone=+07:00
您可以在 java.time
中使用区域和偏移感知 类。你得到一个偏移量(我建议相应地命名参数,因为偏移量不是时区)和日期时间,这足以将同一时刻转换为不同的时区或偏移量。
查看此示例并阅读评论:
public static void main(String[] args) {
// this simulates the parameters passed to your method
String offset = "+07:00";
String date = "2019-11-05/23:00";
// create a LocalDateTime using the date time passed as parameter
LocalDateTime ldt = LocalDateTime.parse(date,
DateTimeFormatter.ofPattern("yyyy-MM-dd/HH:mm"));
// parse the offset
ZoneOffset zoneOffset = ZoneOffset.of(offset);
// create an OffsetDateTime using the parsed offset
OffsetDateTime odt = OffsetDateTime.of(ldt, zoneOffset);
// print the date time with the parsed offset
System.out.println(zoneOffset.toString()
+ ":\t" + odt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
// create a ZonedDateTime from the OffsetDateTime and use UTC as time zone
ZonedDateTime utcZdt = odt.atZoneSameInstant(ZoneOffset.UTC);
// print the date time in UTC using the ISO ZONED DATE TIME format
System.out.println("UTC:\t"
+ utcZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// and then print it again using your desired format
System.out.println("UTC:\t"
+ utcZdt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm")));
}
我系统上的输出是:
+07:00: 2019-11-05T23:00:00+07:00
UTC: 2019-11-05T16:00:00Z
UTC: 2019-11-05-16:00
对于相反的情况(你得到一个 UTC 时间和一个偏移量并想要 OffsetDateTime
),这可能有效:
public static void main(String[] args) {
// this simulates the parameters passed to your method
String offset = "+07:00";
String date = "2019-11-05/16:00";
// provide a pattern
String formatPattern = "yyyy-MM-dd/HH:mm";
// and create a formatter with it
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(formatPattern);
// then parse the time to a local date using the formatter
LocalDateTime ldt = LocalDateTime.parse(date, dtf);
// create a moment in time at the UTC offset (that is just +00:00)
Instant instant = Instant.ofEpochSecond(ldt.toEpochSecond(ZoneOffset.of("+00:00")));
// and convert the time to one with the desired offset
OffsetDateTime zdt = instant.atOffset(ZoneOffset.of(offset));
// finally print it using your formatter
System.out.println("UTC:\t" + ldt.format(dtf));
System.out.println(zdt.getOffset().toString()
+ ": " + zdt.format(DateTimeFormatter.ofPattern(formatPattern)));
}
输出是这样的:
UTC: 2019-11-05/16:00
+07:00: 2019-11-05/23:00
鉴于我有字符串“2019-11-05/23:00”和偏移量“+07:00”,
我将如何在 Java(8) 中将其转换为 LocalDateTime UTC。
我的当前代码
@GetMapping("postDate/{date}")
public void testPost(@RequestParam("timezone") String timeZone, @PathVariable String date) {
String format = "yyyy-MM-dd-HH:mm";
String offset = timeZone;
System.out.println(date);
LocalDateTime timeWithOffset = LocalDateTime.parse(date,
DateTimeFormatter.ofPattern(format));
System.out.println("\n\n\n" + timeWithOffset + "\n\n\n");
// Cant Figure Out to get LocalDateTime timeInUTC
}
邮递员的请求
http://localhost:8080/postDate/2019-11-05-23:00?timezone=+07:00
您可以在 java.time
中使用区域和偏移感知 类。你得到一个偏移量(我建议相应地命名参数,因为偏移量不是时区)和日期时间,这足以将同一时刻转换为不同的时区或偏移量。
查看此示例并阅读评论:
public static void main(String[] args) {
// this simulates the parameters passed to your method
String offset = "+07:00";
String date = "2019-11-05/23:00";
// create a LocalDateTime using the date time passed as parameter
LocalDateTime ldt = LocalDateTime.parse(date,
DateTimeFormatter.ofPattern("yyyy-MM-dd/HH:mm"));
// parse the offset
ZoneOffset zoneOffset = ZoneOffset.of(offset);
// create an OffsetDateTime using the parsed offset
OffsetDateTime odt = OffsetDateTime.of(ldt, zoneOffset);
// print the date time with the parsed offset
System.out.println(zoneOffset.toString()
+ ":\t" + odt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
// create a ZonedDateTime from the OffsetDateTime and use UTC as time zone
ZonedDateTime utcZdt = odt.atZoneSameInstant(ZoneOffset.UTC);
// print the date time in UTC using the ISO ZONED DATE TIME format
System.out.println("UTC:\t"
+ utcZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// and then print it again using your desired format
System.out.println("UTC:\t"
+ utcZdt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm")));
}
我系统上的输出是:
+07:00: 2019-11-05T23:00:00+07:00
UTC: 2019-11-05T16:00:00Z
UTC: 2019-11-05-16:00
对于相反的情况(你得到一个 UTC 时间和一个偏移量并想要 OffsetDateTime
),这可能有效:
public static void main(String[] args) {
// this simulates the parameters passed to your method
String offset = "+07:00";
String date = "2019-11-05/16:00";
// provide a pattern
String formatPattern = "yyyy-MM-dd/HH:mm";
// and create a formatter with it
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(formatPattern);
// then parse the time to a local date using the formatter
LocalDateTime ldt = LocalDateTime.parse(date, dtf);
// create a moment in time at the UTC offset (that is just +00:00)
Instant instant = Instant.ofEpochSecond(ldt.toEpochSecond(ZoneOffset.of("+00:00")));
// and convert the time to one with the desired offset
OffsetDateTime zdt = instant.atOffset(ZoneOffset.of(offset));
// finally print it using your formatter
System.out.println("UTC:\t" + ldt.format(dtf));
System.out.println(zdt.getOffset().toString()
+ ": " + zdt.format(DateTimeFormatter.ofPattern(formatPattern)));
}
输出是这样的:
UTC: 2019-11-05/16:00
+07:00: 2019-11-05/23:00