我有一个格式为 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/