以下是我的输入日期字符串格式:
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的时区差异导致时间变小的原因是什么?
答案 0 :(得分:2)
这是同一时间,除了你使用的第一种格式" HH"小时是"小时(0-23)"和第二种格式使用" hh"那是"凌晨/下午(1-12)"。
答案 1 :(得分:0)
当the other Answer正确指出时,您的格式设置模式使用了错误的字符。
让我们看看另一种现代方法。
您的输入字符串一旦被解码以恢复COLON字符,则采用标准ISO 8601格式。
URLDecoder.decode("2025-08-08T15%3A41%3A46", "UTF-8")
2025-08-08T15:41:46
你正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。