Java 给定时区的日期时间转换
Java Date Time conversion to given timezone
我有一个格式为 Tue, 30 Apr 2019 16:00:00 +0800
的日期时间,即 RFC 2822 formatted date
我需要将其转换为 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)
你误会了。根据 RFC 2822,+0800
表示与 UTC 相比,已经 应用了 8 小时 0 分钟 的偏移量。所以你得到的输出是正确的 GMT 时间。
java.time
我建议您跳过旧的和过时的 类 SimpleDateFOrmat
和 Date
。使用 java.time、现代 Java 日期和时间 API 要好得多。而且它内置了RFC格式,所以我们不需要自己写格式化程序。
OffsetDateTime parsedDateTime = OffsetDateTime
.parse("Tue, 30 Apr 2019 16:00:00 +0800",
DateTimeFormatter.RFC_1123_DATE_TIME);
ZonedDateTime dateTimeInSingapore
= parsedDateTime.atZoneSameInstant(ZoneId.of("Asia/Singapore"));
System.out.println("In Singapore: " + dateTimeInSingapore);
OffsetDateTime dateTimeInGmt
= parsedDateTime.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println("In GMT: " + dateTimeInGmt);
输出:
In Singapore: 2019-04-30T16:00+08:00[Asia/Singapore]
In GMT: 2019-04-30T08:00Z
内置格式化程序被命名为 RFC_1123_DATE_TIME
,因为相同的格式在多个请求评论 (RFC) 中使用。
链接
- RFC 2822 Internet Message Format
- Oracle tutorial: Date Time 解释如何使用 java.time。
在@ole v.v 的解释的帮助下,我将日期时间值分为两个
1次
2. 时区
然后我使用此编码提取与给定时区相关的日期时间
//convert datetime to give timezone
private static String DateTimeConverter (String timeVal, String timeZone)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat offsetDateFormat2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
offsetDateFormat2.setTimeZone(TimeZone.getTimeZone(timeZone));
String result =null;
try {
result = offsetDateFormat2.format(format.parse(timeVal));
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
我有一个格式为 Tue, 30 Apr 2019 16:00:00 +0800
的日期时间,即 RFC 2822 formatted date
我需要将其转换为 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)
你误会了。根据 RFC 2822,+0800
表示与 UTC 相比,已经 应用了 8 小时 0 分钟 的偏移量。所以你得到的输出是正确的 GMT 时间。
java.time
我建议您跳过旧的和过时的 类 SimpleDateFOrmat
和 Date
。使用 java.time、现代 Java 日期和时间 API 要好得多。而且它内置了RFC格式,所以我们不需要自己写格式化程序。
OffsetDateTime parsedDateTime = OffsetDateTime
.parse("Tue, 30 Apr 2019 16:00:00 +0800",
DateTimeFormatter.RFC_1123_DATE_TIME);
ZonedDateTime dateTimeInSingapore
= parsedDateTime.atZoneSameInstant(ZoneId.of("Asia/Singapore"));
System.out.println("In Singapore: " + dateTimeInSingapore);
OffsetDateTime dateTimeInGmt
= parsedDateTime.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println("In GMT: " + dateTimeInGmt);
输出:
In Singapore: 2019-04-30T16:00+08:00[Asia/Singapore] In GMT: 2019-04-30T08:00Z
内置格式化程序被命名为 RFC_1123_DATE_TIME
,因为相同的格式在多个请求评论 (RFC) 中使用。
链接
- RFC 2822 Internet Message Format
- Oracle tutorial: Date Time 解释如何使用 java.time。
在@ole v.v 的解释的帮助下,我将日期时间值分为两个 1次 2. 时区
然后我使用此编码提取与给定时区相关的日期时间
//convert datetime to give timezone
private static String DateTimeConverter (String timeVal, String timeZone)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat offsetDateFormat2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
offsetDateFormat2.setTimeZone(TimeZone.getTimeZone(timeZone));
String result =null;
try {
result = offsetDateFormat2.format(format.parse(timeVal));
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}