Java 日期时间转换为给定时区

标签 java datetime timezone datetime-format timezone-offset

我有一个格式为 Tue, 30 Apr 2019 16:00:00 +0800 的日期时间,它是 RFC 2822 格式的日期

我需要将其转换为 DateTime 中给定的时区,即 +0800

所以如果我总结一下,

DateGiven = Tue, 30 Apr 2019 16:00:00 +0800
DateWanted = 01-05-2019 00:00:00

如何在 Java 中实现此目的? 我已经尝试过下面的代码,但它给出的时间比当前时间少 08 小时,即

30-04-2019 08:00:00

我尝试过的代码

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date startDate = format.parse(programmeDetails.get("startdate").toString());

//Local time zone   
 SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

//Time in GMT
Date dttt= dateFormatLocal.parse( dateFormatGmt.format(startDate) );

最佳答案

您的方法是正确的,但只需使用 java-8 日期时间 API 模块,首先使用输入格式表示创建 DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z");

然后使用OffsetDateTime解析带有偏移量的字符串

OffsetDateTime dateTime = OffsetDateTime.parse("Tue, 30 Apr 2019 16:00:00 +0800",formatter);

并调用toLocalDateTime()方法获取本地时间

LocalDateTime localDateTime = dateTime.toLocalDateTime();  //2019-04-30T16:00

如果您希望再次以特定格式输出,您可以使用 DateTimeFormatter

localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)   //2019-04-30T16:00:00

注意: 正如 @Ole V.V 在评论中指出的那样,将输入字符串解析为 util.Date 后您正在获取 UTC 时间

The class Date represents a specific instant in time, with millisecond precision.

现在,如果您将解析的日期时间转换为 UTC,您将得到 2019-04-30T08:00Z 且没有偏移量,因此您可以使用 withOffsetSameInstant将其转换为任何特定时区

dateTime.withOffsetSameInstant(ZoneOffset.UTC)

关于Java 日期时间转换为给定时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58830202/

相关文章:

Java 最佳实践 : nested getters? 或委托(delegate)?

java - 使用 SimpleDateFormat,Java 的日期解析不正确

java - 使用存储在堆栈中的对象的方法 (javafx)

android - "Fri, 12 Sep 2014 05:00:23 GMT",SimpleDateFormat 有什么问题?

从多个时区读取 R 中的时间戳数据

R 中 difftime 的结果与 excel 和 timeanddate.com 不同

Java 记录 StackOverflow RuntimeException

python - 如何从包含日期时间对象的数组中进行插值?

python - (python和mysql)我如何设法获取当前日期时间和mysql表中的某个日期时间之间花费的时间?

java - 如何解析带有数字时区偏移的时间戳?