Java 如何使用SimpleDataFormatter将2019-09-18T01:44:35GMT-04:00转换为2019-09-18T01:44:35-04:00
我想将日期和时间转换为用户请求的时区。日期和时间为GMT格式。我尝试获得解决方案,但最终字符串包含结果日期中的GMT字符串,如(2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用GMT字符串Java 如何使用SimpleDataFormatter将2019-09-18T01:44:35GMT-04:00转换为2019-09-18T01:44:35-04:00,java,datetime,timezone,gmt,Java,Datetime,Timezone,Gmt,我想将日期和时间转换为用户请求的时区。日期和时间为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) ret
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;
}
实际输出:2019-09-18T01:44:35GMT-04:00
预期输出:2019-09-18T01:44:35-04:00
使用以下格式:
fromFormat=“yyyy-mm-dd'HH:mm:sszXXX”
toFormat=“yyyy-mm-dd'HH:mm:ssXXX” 处理日期时间对象,而不是字符串 您的问题以错误的方式提出,这很可能是由于您的程序中存在设计缺陷。在程序中不应将日期和时间作为字符串处理。始终将日期和时间保存在适当的datetime对象中,例如
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);
请将您的用户所需的时区替换为我放置在美国/纽约的时区。始终以这种格式给出时区(地区/城市)。当前代码段的输出为:
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格式。此格式适用于序列化,也就是说,如果需要将datetime转换为机器可读的文本格式,例如用于持久化或与其他系统交换。虽然它也是人类可读的,但它不是您的用户希望看到的。正如我所说,这肯定不是你应该在你的程序中处理和处理的
链接
- 解释如何使用java.time
sdf
解析并使用sdf
格式化结果日期,则不会发生任何更改。如果您只想删除GMT
字符串,为什么还要解析日期呢。你不能从字符串中删除它吗?嗨@DanielBarbarian我可以用“”替换GMT
,但我想使用SimpleDataFormat Cals你不应该使用SimpleDataFormat
,时区
和日期
。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。而是使用DateTimeFormatter
、ZoneId
和来自的其他类。