乔达时间库 指定 mili 秒精度



我正在使用代码截图将日期和时间字符串转换为 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 不适用

最新更新