Java 8 强制Java8LocalTime toString报告省略的值

Java 8 强制Java8LocalTime toString报告省略的值,java-8,tostring,localtime,Java 8,Tostring,Localtime,我有以下datetime助手方法,可以将UTC分区的Java 8日期转换为datetime字符串: public static String dateTimeString(Date date) { return date.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime().toString(); } 所需的结果是始终将结果字符串格式化为: YYYY-MM-dd'HH:MM:ss'Z' 问题是,Java8LocalTimeToSt

我有以下datetime助手方法,可以将UTC分区的Java 8日期转换为datetime字符串:

public static String dateTimeString(Date date) {
    return date.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime().toString();
}
所需的结果是始终将结果字符串格式化为:

YYYY-MM-dd'HH:MM:ss'Z'

问题是,Java8LocalTimeToString故意去除了零时间组件。例如,如果我有一个日期实例,表示2018年6月8日UTC 12:35:00。那么上述方法的输出为:2018-06-08'T'12:35'Z'。然而,我希望它包含任何调零的秒/分钟/小时组件,例如2018-06-08'T'12:35:00'Z'


有什么想法吗?

似乎没有现成的解决方案。最简单的方法是编写您自己的类,该类扩展并重写方法publicstringformatTemporalAccessor-temporal,您可以在其中调用原始方法,然后根据需要修改输出字符串。请参阅格式化程序的标志“Z”。如果该标志存在,则需要修改原始输出。

似乎没有现成的解决方案。最简单的方法是编写您自己的类,该类扩展并重写方法publicstringformatTemporalAccessor-temporal,您可以在其中调用原始方法,然后根据需要修改输出字符串。请参阅格式化程序的标志“Z”。如果该标志存在,那么您需要修改原始输出。

我不明白为什么在Java的实际输出看起来像2018-06-08T12:35Z时,您会将默认输出的字母括在单引号中,但不管怎样,下面的代码按照需要生成它,没有遗漏:

final LocalDateTime ldt = LocalDateTime.of(2018, 6, 8, 12, 35, 0);

final ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("Z"));

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'''T'''HH:mm:ss''X''", Locale.US);

System.err.println(dtf.format(zdt));
输出:

2018-06-08'T'12:35:00'Z'
就我个人而言,我可能更喜欢这样的格式,包含毫秒,提供不需要用户额外知识的时区信息,并且没有多余的字符:

FORMAT: "yyyy-MM-dd HH:mm:ss'.'SSS Z"

OUTPUT: 2018-06-08 12:35:12.345 +0200

我不明白为什么当Java的实际输出看起来像2018-06-08T12:35Z时,您会将默认输出的字母括在单引号中,但无论如何,下面的代码可以按需要生成它,没有遗漏:

final LocalDateTime ldt = LocalDateTime.of(2018, 6, 8, 12, 35, 0);

final ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("Z"));

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'''T'''HH:mm:ss''X''", Locale.US);

System.err.println(dtf.format(zdt));
输出:

2018-06-08'T'12:35:00'Z'
就我个人而言,我可能更喜欢这样的格式,包含毫秒,提供不需要用户额外知识的时区信息,并且没有多余的字符:

FORMAT: "yyyy-MM-dd HH:mm:ss'.'SSS Z"

OUTPUT: 2018-06-08 12:35:12.345 +0200
只需使用固定格式的模式字符串即可获得所需的格式。让我们试试看:

    System.out.println(dateTimeString(new Date(0)));
    System.out.println(dateTimeString(new Date(1_524_560_255_555L)));
这张照片是:

1970-01-01T00:00:00Z
2018-04-24T08:57:35Z
在第一个示例中,打印小时、分钟和秒,即使它们为0。 在第二个示例中,省略了milliseoncds,即使它们不是零,您可以看到我指定的毫秒值以555结尾。 综上所述,无论您使用的是2018-06-08T12:35Z、2018-06-08T12:35:00Z还是2018-06-08T12:35:00.000000000Z,输出都符合ISO 8601格式。因此,在费心定义自己的格式化程序之前,您可能需要再次检查省略第二个是否适用

链接:

只需使用固定格式的模式字符串即可获得所需的格式。让我们试试看:

    System.out.println(dateTimeString(new Date(0)));
    System.out.println(dateTimeString(new Date(1_524_560_255_555L)));
这张照片是:

1970-01-01T00:00:00Z
2018-04-24T08:57:35Z
在第一个示例中,打印小时、分钟和秒,即使它们为0。 在第二个示例中,省略了milliseoncds,即使它们不是零,您可以看到我指定的毫秒值以555结尾。 综上所述,无论您使用的是2018-06-08T12:35Z、2018-06-08T12:35:00Z还是2018-06-08T12:35:00.000000000Z,输出都符合ISO 8601格式。因此,在费心定义自己的格式化程序之前,您可能需要再次检查省略第二个是否适用


链接:

显然,您可以创建自己的DateTimeFormat,将其格式化为这样,除非没有遗漏。我没有其他想法。我会接受这个解决方案@DreamspacePresident+1-有没有关于代码的想法?可能是重复的谢谢@OleV.V+1然而,这个问题的公认答案使用DateTimeFormatter.ofpatternyyyyy-MM-dd'HH:MM:ss:SSS,它不是UTC分区的。好的,hotmeatballsoup,我用代码作为答案发布了它。显然,你可以创建自己的DateTimeFormat,它的格式如下,除非没有遗漏。我没有其他想法。我会接受这个解决方案@DreamspacePresident+1-有没有关于代码的想法?可能是重复的谢谢@OleV.V+1然而,这个问题的公认答案使用DateTimeFormatter.ofpatternyyyyy MM dd'HH:MM:ss:SSS,它不是UTC分区的。好的,hotmeatballsoup,我用代码作为答案发布了它。DateTimeFormatter类是最终的,您不能扩展它的子类。另外,仅仅定义自己的格式模式字符串似乎更简单。@Ole V.V.-你说得对,我没听清楚。然后,您可以拥有自己的类,该类将包含DateTimeFormatter类,即包装器类。您可以编写DateTimeFormatter的所有方法,并将它们转换为除公共字符串格式TemporalAccessor temporal wher之外的原始方法
e您需要根据需要对原始结果进行修改。需要做更多的工作,但会完成DateTimeFormatterclass是最终的,您不能扩展它的子类。另外,仅仅定义自己的格式模式字符串似乎更简单。@Ole V.V.-你说得对,我没听清楚。然后,您可以拥有自己的类,该类将包含DateTimeFormatter类,即包装器类。您可以编写DateTimeFormatter的所有方法,并将它们转换为原始方法,公共字符串格式TemporalAccessor temporal除外,您需要根据需要对原始结果进行修改。再多做一点工作,但这会让Dreamspace President+1更完美!如何/在何处将其格式化为UTC分区?我能做的最好的事情是GMT:将4行代码第3行中的X替换为OOOO,这将部分输出从Z更改为GMT;格林尼治时间+08:00;UTC-08:00但我从来没有制作过UTC,它总是说GMT。谢谢@Dreamspace President+1!如何/在何处将其格式化为UTC分区?我能做的最好的事情是GMT:将4行代码第3行中的X替换为OOOO,这将部分输出从Z更改为GMT;格林尼治时间+08:00;UTC-08:00,但我从来没有制作过UTC,它总是说GMT。