【问题标题】:How to print a date with a custom format in Java 8?如何在 Java 8 中以自定义格式打印日期?
【发布时间】:2019-06-08 13:47:10
【问题描述】:

我想创建一个如下所示的格式化图表:

每个字段中的字符数分别为 4、12、17、40 和 4。这些字段也是左对齐的。

通过使用我在下面发布的代码,我的结果如下所示:

格式化代码sn-p:

for (Tasks examined : shortList) {
  String yesNo = examined.isDone() == true ? "yes" : "no";
  System.out.printf("%1$-4s" + "| " + "%2$tY.%<tm.%<-12td." 
     + "| " + "%3$-17s" + "| " + "%4$-40s" + "| " + yesNo + "\n"
               , examined.getNumber(), examined.getDeadline()
               , importanceLevel, examined.getName())
}

变量类型有:

examined.getNumber() //integer
examined.getDeadline() //DateTime
importanceLevel //String
examined.getName() //String

我研究了 JavaDocs here 中的 Formatter 类。但我无法解决问题。

这里的主要问题是“日期”字段末尾的点 (.)。它不应该在日期和句号之间有所有空格。

我想用 -12 标志来组织“日期”元素的宽度,但这只是将其余部分作为上面的最后一个点。

如何解决?

【问题讨论】:

  • 你能展示这些变量在格式化之前的样子吗? :examined.getNumber(), examined.getDeadline(), importanceLevel, examined.getName()
  • 当然。按顺序:正常数字,例如1、日期以DateTime格式存储:2018和12和12,下一个是String,最后一个也是。
  • 请考虑选择我的答案作为接受的解决方案,如果它有助于解决您的问题。您可以通过单击答案旁边的复选标记来做到这一点。您可以查看this guide 了解如何操作。克什

标签: java string date printf


【解决方案1】:

如果我正确理解您的要求,这可能会解决您的问题:

int index = 1;
                                   //yyyy, MM, dd, hh, min
LocalDateTime ldt = LocalDateTime.of(2018, 12, 31, 12, 10);
                               //specify custom pattern here
String date = DateTimeFormatter.ofPattern("yyyy.MM.dd.").format(ldt);
String importance = "kozepesen fontos";
String name = "egyik feladat";
String yesNo = "yes";
String formatter = "%-4d| %-12s| %-17s| %-40s| %-5s%n";
//now use System.out.format() to print with pattern specified in 'formatter'
System.out.format(formatter, index, date, importance, name, yesNo);

输出:

1 | 2018.12.31. | kozepesen fontos | egyik feladat | yes

  1. 在上面的解决方案中,我们不可避免地将日期转换为字符串。也就是说,我们可以指定一个 custom 模式来显示日期。首先,我们使用所需的模式创建一个 DateTimeFormatter() 实例。该模式是使用 DateTimeFormatter 的 ofPattern(String pattern) 方法指定的。然后,为了获得一个 String 作为返回类型,我们再次使用 DateTimeFormatter 中的format(TemporalAccessor temporal) 方法。我们可以使用 DateTime 实例作为format() 中的TemporalAccessor 参数,如上代码所示。

  2. 那么String formatter = "%-4d| %-12s| %-17s| %-40s| %5s%n" 是如何工作的呢? 我在 Java 8 中使用了 Formatter documentation 的语法。

    - -> 结果将左对齐

    % -> 结果是文字

    n -> 结果是平台特定的行分隔符

    d -> 结果被格式化为十进制整数

    s -> 如果参数 arg 是 null,那么结果是“null”。如果 arg implements Formattable,则调用 arg.formatTo()。否则,通过调用arg.toString()获取结果。

最后,我使用的数字指定了每个字段允许的字符数。

  1. 最后,我们调用System.out.format 而不是printf(),其中格式指定字符串first 参数,所有其他要格式化的变量必须是以正确的顺序输入(与格式指定字符串中的顺序相同)。

【讨论】:

  • 完美运行。非常优雅的解决方案。我错过的是行分隔符和格式化程序。谢谢。
  • 没问题。编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多