如何使用 SimpleDateFormatter 将 2019-09-18T01:44:35GMT-04:00 转换为 2019-09-18T01:44:35-04:00
How to convert 2019-09-18T01:44:35GMT-04:00 to 2019-09-18T01:44:35-04:00 using SimpleDateFormatter
我想将日期和时间转换为用户请求的时区。日期和时间采用 GMT 格式。我尝试找到解决方案,但最终字符串在结果日期中包含 GMT 字符串,例如 (2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用 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
使用这些格式:
格式 = "yyyy-mm-dd'T'HH:mm:sszXXX"
格式 = "yyyy-mm-dd'T'HH:mm:ssXXX"
处理日期时间对象,而不是字符串
你的问题提错了,这很可能是你程序的设计缺陷造成的。 您不应在程序中将日期和时间作为字符串处理。 始终将日期和时间保存在适当的日期时间对象中,例如 Instant
、OffsetDateTime
和 ZonedDateTime
.提到的 类 来自 java.time,现代 Java 日期和时间 API,这是我们保存和处理日期时间数据的最佳方法。
因此您的问题可能会变成:如何将时刻转换为用户请求的时区?时刻由 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);
请在我放置 America/New_York 的位置替换您的用户所需的时区。始终以这种格式提供时区 (region/city)。片段的输出是:
2019-09-18T01:44:35-04:00[America/New_York]
假设您不想要输出的 [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格式。这种格式有利于序列化,也就是说,如果您需要将日期时间转换为机器可读的文本格式,例如为了持久化或与其他系统交换。虽然也是人类可读的,但这不是您的用户喜欢看到的。正如我所说,这当然不是您应该在程序中处理和处理的内容。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601
我想将日期和时间转换为用户请求的时区。日期和时间采用 GMT 格式。我尝试找到解决方案,但最终字符串在结果日期中包含 GMT 字符串,例如 (2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用 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
使用这些格式:
格式 = "yyyy-mm-dd'T'HH:mm:sszXXX"
格式 = "yyyy-mm-dd'T'HH:mm:ssXXX"
处理日期时间对象,而不是字符串
你的问题提错了,这很可能是你程序的设计缺陷造成的。 您不应在程序中将日期和时间作为字符串处理。 始终将日期和时间保存在适当的日期时间对象中,例如 Instant
、OffsetDateTime
和 ZonedDateTime
.提到的 类 来自 java.time,现代 Java 日期和时间 API,这是我们保存和处理日期时间数据的最佳方法。
因此您的问题可能会变成:如何将时刻转换为用户请求的时区?时刻由 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);
请在我放置 America/New_York 的位置替换您的用户所需的时区。始终以这种格式提供时区 (region/city)。片段的输出是:
2019-09-18T01:44:35-04:00[America/New_York]
假设您不想要输出的 [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格式。这种格式有利于序列化,也就是说,如果您需要将日期时间转换为机器可读的文本格式,例如为了持久化或与其他系统交换。虽然也是人类可读的,但这不是您的用户喜欢看到的。正如我所说,这当然不是您应该在程序中处理和处理的内容。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601