如何在Java8中使用自定义格式打印日期?

如何在Java8中使用自定义格式打印日期?,java,string,date,printf,Java,String,Date,Printf,我想创建一个格式化的图表,如下所示: 每个字段中的字符数分别为4、12、17、40和4。字段也是左对齐的 通过使用我在下面发布的代码,我的结果如下所示: 用于格式化的代码段: for (Tasks examined : shortList) { String yesNo = examined.isDone() == true ? "yes" : "no"; System.out.printf("%1$-4s" + "| " + "%2$tY.%<tm.%<-12td."

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

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

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

用于格式化的代码段:

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())
}
我在JavaDocs中学习了格式化程序类。但我无法解决这个问题

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

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


如何解决这个问题?

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

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|是

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

  • 那么
    字符串格式化程序=“%-4d |%-12s |%-17s |%-40s |%5s%n”
    是如何工作的呢? 我使用了Java8的语法

    -
    ->结果将左对齐

    %
    ->结果是一个文本

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

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

    s
    ->如果参数arg为
    null
    ,则结果为“null”。如果arg
    实现Formattable
    ,则调用
    arg.formatTo()
    。否则,将通过调用
    arg.toString()
    获得结果

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

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

  • 您能否在格式化之前显示这些变量的外观<代码>检查过的.getNumber(),检查过的.getDeadline(),importanceLevel,检查过的.getName()确定。正常数,如1,日期存储在日期时间格式:2018和12和12,下一个是字符串,最后一个也是。请考虑选择我的答案作为可接受的解决方案,如果它帮助解决了你的问题。您可以通过单击答案旁边的复选标记来完成此操作。你可以看看怎么做。克什米尔工作得很好。非常优雅的解决方案。我错过的是行分隔符和格式化程序。谢谢,没问题。快乐编码!
    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);