与GMT的时区差异导致数小时变化?

时间:2017-05-22 21:20:02

标签: java date simpledateformat

以下是我的输入日期字符串格式:

2025-08-08T15%3A41%3A46

我必须按以下格式转换上面的字符串日期:

Fri Aug 08 15:41:46 GMT-07:00 2025

我得到了以下代码:

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
String decodedDate = URLDecoder.decode("2025-08-08T15%3A41%3A46", "UTF-8");
Date date = dateParser.parse(decodedDate);

//Decode the given date and convert to Date object
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT-07:00"));

System.out.println(sdf.format(date));

这就是它在控制台上输出的内容。我不确定为什么它打印出不同的小时值,与我在上面所需的输出中相比。它应打印出15,但它正在打印03

Fri Aug 08 03:41:46 GMT-07:00 2025

我不确定由于与GMT的时区差异导致时间变小的原因是什么?

2 个答案:

答案 0 :(得分:2)

这是同一时间,除了你使用的第一种格式" HH"小时是"小时(0-23)"和第二种格式使用" hh"那是"凌晨/下午(1-12)"。

答案 1 :(得分:0)

the other Answer正确指出时,您的格式设置模式使用了错误的字符。

让我们看看另一种现代方法。

ISO 8601

您的输入字符串一旦被解码以恢复COLON字符,则采用标准ISO 8601格式。

URLDecoder.decode("2025-08-08T15%3A41%3A46", "UTF-8")
  

2025-08-08T15:41:46

使用java.time

你正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是java.time类。

在解析/生成字符串时,java.time类默认使用ISO 8601

您的输入字符串缺少任何偏离UTC或时区的指示。所以我们解析为LocalDateTime

LocalDateTime ldt = LocalDateTime.parse( "2025-08-08T15:41:46" ) 
  

ldt.toString():2025-08-08T15:41:46

如果您知道预期的时区,请指定ZoneId以生成ZonedDateTime

ZonedDateTime zdt = ldt.atZone( ZoneId.of( "America/Montreal" ) ) ;
  

zdt.toString():2025-08-08T15:41:46-04:00 [美国/蒙特利尔]

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore