我想将日期和时间转换为用户请求的时区。日期和时间采用GMT格式。我试图找到解决方案,但最终字符串包含结果日期为(2019-09-18T01:44:35GMT-04:00)的GMT字符串。我不希望在结果输出中使用GMT字符串。
public static String cnvtGMTtoUserReqTZ(String date, String format, String timeZone) {
// null check
if (date == null)
return null;
// create SimpleDateFormat object with input format
SimpleDateFormat sdf = new SimpleDateFormat(format);
// set timezone to SimpleDateFormat
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
try {
// converting date from String type to Date type
Date _date = sdf.parse(date);
// return Date in required format with timezone as String
return sdf.format(_date);
} catch (ParseException e) {
//log.info("Exception in cnvtGMTtoUserReqTime ::: " + e);
}
return null;
}
Actual Output : 2019-09-18T01:44:35GMT-04:00
Expected Output: 2019-09-18T01:44:35-04:00
答案 0 :(得分:0)
使用以下格式:
fromFormat =“ yyyy-mm-dd'T'HH:mm:sszXXX”
toFormat =“ yyyy-mm-dd'T'HH:mm:ssXXX”
答案 1 :(得分:0)
您的问题输入方式有误,这很可能是由于程序中的设计缺陷所致。 您不应在程序中将日期和时间作为字符串处理。始终将日期和时间保留在正确的日期时间对象中,例如Instant
,OffsetDateTime
和ZonedDateTime
。提到的类来自现代的Java日期和时间API java.time,这是我们保存和处理datetime数据的最佳方法。
例如,您的问题可能变成:如何将时刻转换为用户请求的时区?时刻由Instant
对象表示。问题的答案是:
ZoneId userRequestedTimeZone = ZoneId.of("America/New_York");
Instant moment = Instant.parse("2019-09-18T05:44:35Z");
ZonedDateTime userDateTime = moment.atZone(userRequestedTimeZone);
System.out.println(userDateTime);
请用您希望的用户时区代替我在美国/纽约州放置的时区。始终以这种格式提供时区( region / city )。该代码段的当前输出为:
2019-09-18T01:44:35-04:00 [美国/纽约]
假设您不希望输出的[America/New_York]
部分,请将日期时间格式化为所需的字符串:
String dateTimeWithNoZoneId = userDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(dateTimeWithNoZoneId);
2019-09-18T01:44:35-04:00
后者的输出为ISO 8601格式。此格式非常适合序列化,也就是说,如果您需要将日期时间转换为机器可读的文本格式,例如用于持久性或与其他系统交换。虽然也易于阅读,但并不是您的用户希望看到的。就像我说的,肯定不是您应该在程序内部处理和处理的东西。