如何忽略毫秒并使用DateTimeFormatter格式化

如何忽略毫秒并使用DateTimeFormatter格式化,datetime,java-8,Datetime,Java 8,我正在尝试使用DateTimeParser和DateTimeFormatter来格式化日期时间。我的要求是将输入字符串格式化为“yyyy-MM-dd'T'HH:MM:ssZ”格式,而不管输入是否有毫秒。我使用下面的代码来解析输入。但到目前为止,我只能让它在有毫秒或没有毫秒的情况下工作 这是我的方法: public static DateTime convertDateTime(String dateTime){ DateTimeParser parsers = DateTimeFormat.fo

我正在尝试使用DateTimeParser和DateTimeFormatter来格式化日期时间。我的要求是将输入字符串格式化为“yyyy-MM-dd'T'HH:MM:ssZ”格式,而不管输入是否有毫秒。我使用下面的代码来解析输入。但到目前为止,我只能让它在有毫秒或没有毫秒的情况下工作

这是我的方法:

public static DateTime convertDateTime(String dateTime){
DateTimeParser parsers = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").getParser();
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(parsers ).toFormatter().withLocale(Locale.US).withChronology(ISOChronology.getInstanceUTC());
return DateTime.parse(dateTime,formatter);
}

使用的进口:

import org.joda.time.DateTime;
import org.joda.time.chrono.ISOChronology;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
import org.joda.time.format.DateTimeParser;
我希望我的代码接受两种不同的输入形式(有毫秒或没有毫秒),并返回一个没有毫秒的日期时间

示例:

input can be: 

    2020-10-01T12:05:22.458-04:00
    2020-10-01T12:05:22-04:00
Output:
2020-10-01T12:05:22-04:00
在此方面的任何帮助都将不胜感激。谢谢

您正在重新创造新的环境

对于这种格式,毫秒已经是可选的。您只需在出现时截断它们,即可获得所需的结果。格式甚至是标准格式,因此代码非常简单:

String[] samples = {
    "2020-10-01T12:05:22.458-04:00",
    "2020-10-01T12:05:22-04:00",
};
for(String s: samples) {
    ZonedDateTime parsed = ZonedDateTime.parse(s).with(ChronoField.MILLI_OF_SECOND, 0);
    System.out.println(parsed);
}
请注意,我使用了
MILLI_OF_SECOND
使解决方案更直观地处理删除毫秒的任务。实际上,毫秒只是纳秒,精度较低,因此,一旦理解了它,就可以使用更简单的
ZonedDateTime.parse.withNano(0)

或者,正如Ole V.V.所建议的那样,
ZonedDateTime.parse.truncatedTo(ChronoUnit.SECONDS)
,这可能更容易掌握。

您正在重新发明

对于这种格式,毫秒已经是可选的。您只需在出现时截断它们,即可获得所需的结果。格式甚至是标准格式,因此代码非常简单:

String[] samples = {
    "2020-10-01T12:05:22.458-04:00",
    "2020-10-01T12:05:22-04:00",
};
for(String s: samples) {
    ZonedDateTime parsed = ZonedDateTime.parse(s).with(ChronoField.MILLI_OF_SECOND, 0);
    System.out.println(parsed);
}
请注意,我使用了
MILLI_OF_SECOND
使解决方案更直观地处理删除毫秒的任务。实际上,毫秒只是纳秒,精度较低,因此,一旦理解了它,就可以使用更简单的
ZonedDateTime.parse.withNano(0)


或者,正如Ole V.V.所建议的那样,
ZonedDateTime.parse(s).truncatedTo(ChronoUnit.SECONDS)
,这可能更容易掌握。

您可能需要有关如何导入这些
DateTime
的帖子信息?同时发布两个您可以拥有的输入示例和预期的输出。您可能需要发布有关如何导入这些
DateTime
的信息?另外,还可以发布两个输入示例和预期输出。谢谢@Holger!这确实有用!更好:
zoneDateTime.parse.truncatedTo(ChronoUnit.SECOND)
。我相信它能更好地传达意图,并且消除任何微秒和纳秒。谢谢@Holger!这确实有用!更好:
zoneDateTime.parse.truncatedTo(ChronoUnit.SECOND)
。我相信它能更好地传达意图,并且消除任何微秒和纳秒。