首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强迫Java 8 LocalTime toString报告省略的值

强迫Java 8 LocalTime toString报告省略的值
EN

Stack Overflow用户
提问于 2018-04-24 08:01:47
回答 3查看 554关注 0票数 1

我有以下datetime方法,它将UTC分区的Java 8 Date转换为日期时间字符串:

代码语言:javascript
复制
public static String dateTimeString(Date date) {
    return date.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime().toString();
}

所需的结果是始终将结果字符串格式化为:

YYYY mm-dd‘T’‘Z:mm:ss’Z‘

问题是,Java 8 LocalTime#toString() 故意删除时间为零的组件。例如,如果我有一个Date实例,表示2018年6月8日12:35:00UTC的。然后,上述方法的输出为: 2018-06-08'T'12:35'Z‘。而我希望它包含任何零点的秒/分钟/小时组件(例如2018-06-08'T'12:35:00'Z')。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-24 08:59:51

代码语言:javascript
复制
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");

public static String dateTimeString(Date date) {
    return date.toInstant().atOffset(ZoneOffset.UTC).format(formatter);
}

只需使用固定格式模式字符串来获取所需的格式。我们试试看:

代码语言:javascript
复制
    System.out.println(dateTimeString(new Date(0)));
    System.out.println(dateTimeString(new Date(1_524_560_255_555L)));

这些指纹:

代码语言:javascript
复制
1970-01-01T00:00:00Z
2018-04-24T08:57:35Z
  • 在第一个示例中,即使是0,也会打印小时、分钟和秒。
  • 在第二个示例中,即使毫秒为非零(您可以看到我在555中指定的毫秒值结束),也省略了milliseoncds。

所有这一切,输出符合ISO 8601格式,无论您是否有2018-06-08T12:35Z2018-06-08T12:35:00Z,甚至2018-06-08T12:35:00.000000000Z。因此,您可能需要再次检查一下,在定义自己的格式化程序之前,是否为了您的目的而忽略了第二个工作。

链接: 维基百科文章: ISO 8601

票数 3
EN

Stack Overflow用户

发布于 2018-04-24 08:30:04

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

代码语言:javascript
复制
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));

输出:

代码语言:javascript
复制
2018-06-08'T'12:35:00'Z'

就我个人而言,我可能更喜欢这样的格式,其中包含millis,给出的时区信息不需要用户提供额外的知识,也不需要额外的字符:

代码语言:javascript
复制
FORMAT: "yyyy-MM-dd HH:mm:ss'.'SSS Z"

OUTPUT: 2018-06-08 12:35:12.345 +0200
票数 1
EN

Stack Overflow用户

发布于 2018-04-24 08:25:17

似乎没有开箱即用的解决方案。最简单的方法是编写扩展DateTimeFormatter和重写方法public String format(TemporalAccessor temporal)的自己的类,在其中调用原始方法,然后在必要时修改输出字符串。看到标志'Z‘的格式化程序。如果存在该标志,则需要修改原始输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49996375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档