我正在使用代码截图将日期和时间字符串转换为 Joda DateTime 对象 -
String time = "124204";
String date = "05/09/25";
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/mm/yyhhmmss").withZone(DateTimeZone.UTC);
String dateInString = date.concat(time);
DateTime dateTime = DateTime.parse(dateInString, formatter);
System.out.println(dateTime);
我得到输出为 - 2025-01-05T00:42:04.000Z
但我想要它 - 2025-01-05T00:42:04.000000Z
我希望 mili 秒精度为 6 位。
我该怎么做?感谢您的帮助。
你很困惑。
你似乎认为你有一根绳子。你没有;您有一个类型为DateTime
的对象。您所看到的是在其中一个对象上调用toString()
的结果,并且与所有toString()
方法一样,这只是一个调试辅助工具。这是为了你的开发人员的眼球,绝对没有别的(如果你把它用于其他事情,停止这样做)。
如果您希望输出采用某种特定格式,请创建第二个DateTimeFormat
对象并使用它。你正在使用第一个将字符串转换为日期时间对象(parse
方法)。这些格式化程序对象是双向的;他们还可以使用format
方法将 DATETIME 对象转换回字符串。这样做。制作你想要的模式,调用.format
,将你拥有的dateTime
对象交给它。
NB:你为什么使用jodatime?它已被java.time
包淘汰,该包由与jodatime相同的作者编写。
只要你至少在 Java 8 上,就使用 java.time:
String time = "124204";
String date = "05/09/25";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyHHmmss").withZone(ZoneId.of("UTC"));
String dateInString = date.concat(time);
ZonedDateTime dateTime = ZonedDateTime.parse(dateInString, parser);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX");
System.out.println(dateTime.format(formatter));
这将打印 2025-09-05T12:42:04.000000Z。不确定您是否真的打算在输入中使用 12 小时格式,我没有经验,所以我忽略了这一点。
Joda-Time 解决方案(已过时)
您可能不需要结果秒数上的这 6 位小数。你可能想再考虑这个问题。您要求的格式是ISO 8601。ISO 8601格式没有规定小数位数,而是由交换数据的各方商定。大多数实现接受不同数量的小数(达到一定的限制,但在我遇到的情况下提供少于限制是没有问题的)。
其他人是正确的,你很可能会考虑升级到java.time,Joda-Time的继任者。如果您现在负担不起,这里有一种方法可以使用 Joda-Time 获取您想要的字符串。
String time = "124204";
String date = "05/09/25";
DateTimeFormatter timeFormatter = DateTimeFormat.forPattern("HHmmss");
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd/MM/yy");
LocalTime lt = LocalTime.parse(time, timeFormatter);
LocalDate ld = LocalDate.parse(date, dateFormatter);
DateTime dateTime = ld.toLocalDateTime(lt).toDateTime(DateTimeZone.UTC);
DateTimeFormatter resultFormatter
= DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZ");
String dateTimeString = dateTime.toString(resultFormatter);
System.out.println(dateTimeString);
输出:
2025-09-05T12:42:04.000000+00:00
我注意到你要求2025-01-05T00:42:04.000000Z
.也许您没有注意到时间字符串中的小时是12
(不是00
),日期字符串中的月份是09
(不是01
)。在您自己的代码中,您得到了不正确的小时和月份,因为您在格式模式中始终使用了小写模式字母。我们需要大写HH
表示一天中的小时,大写MM
表示月。
编辑:您还希望Z
而不是+00:00
表示UTC(UTC偏移零),就像您从无参数DateTime.toString()
中得到的那样。同样,ISO 8601允许两者兼而有之,因此可能无关紧要。不过,我很惊讶没有找到一种简单的方法来获得Z
。以下格式化程序给出了它,但我可能缺少更简单的东西。
DateTimeFormatter resultFormatter = new DateTimeFormatterBuilder()
.append(ISODateTimeFormat.dateHourMinuteSecond())
.appendPattern(".SSSSSS")
.appendTimeZoneOffset("Z", true, 2, 2)
.toFormatter();
2025-09-05T12:42:04.000000Z
我还使用了不同的解析方法。在连接两个字符串并解析结果时,我发现单独解析每个字符串更清晰。
正如其他人所说,当您要求特定格式时,例如秒上的特定小数位数,您只能在字符串中使用该格式。因此,解决方案是将DateTime
格式化为字符串。
用法:毫秒是千分之一秒。因此,要求 6 位毫秒是没有意义的,也不会给你更高的精度。我把你的问题理解为秒的分数点的 6 位小数——也称为微秒(百万分之一秒)。
链接
- 维基百科文章:ISO 8601
- 可能类似的问题:Scala/Joda - Joda DateTimeFormat 不适用