首页 > 解决方案 > 格式化时%-8.8s是什么意思?你能解释一下这个日期格式 %1$tY%1$tm%1$td 吗?

问题描述

我得到'-'是左对齐,但中间的句点('.')是什么?

我还看到很多#impliedDecimal7SignLastTwoZero。我读到“隐含十进制只是意味着在字段中的指定位置隐含了一个小数点,但实际上并不存在于文件中”,但我没有得到“7SignLastTwoZero”部分。

标签: javaformatting

解决方案


%-8.8s

为了初步了解,让我们尝试一下:

    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "12345678");
    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "12345");
    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "123456789012");

输出是:

<12345678>
<12345   >
<12345678>

正如您所说%-8s,将在 8 个位置左对齐打印输出。除外:如果输出长度超过 8 个字符,则将其打印在所需的多个位置。这就是 extra.8有所不同的地方:它最多将输出截断到 8 个位置,如您在上面的第三行中看到的那样。它在文档中:

通用、字符和数字类型的格式说明符具有以下语法:

  %[argument_index$][flags][width][.precision]conversion

…</p>

可选精度是一个非负十进制整数,通常用于限制字符数。具体行为取决于转换。

…</p>

精确

对于一般参数类型,精度是要写入输出的最大字符数。

你补充说:

要求是: 用于报告学生信息的唯一 8 位学校 ID。字母数字,长度:8

在这种情况下,我会警告不要%-8.8s. 如果不小心有一个 9 位或 10 位的 ID,没有人会发现,因为格式默认截断为 8 位。最好打印所有数字以便我们可以看到它们,或者以某种方式报告错误。

%1$tY%1$tm%1$td

    System.out.format(Locale.ENGLISH, "%1$tY%1$tm%1$td%n",
                        LocalDate.now(ZoneId.of("Europe/Kirov")));

20200129

此格式字符串将参数 1 中的年、月和日打印到格式方法。1$表示格式字符串之后的第一个参数。t表示日期和/或时间,和Ym以及d日期的不同部分。因此,输出意味着 2020 年,即 1 月 29 日。所有这些都记录在案:

可选的argument_index是一个十进制整数,指示参数在参数列表中的位置。第一个参数由“1$”引用,第二个由“2$”引用,以此类推。

…</p>

Conversion  Argument Category  Description
------------------------------------------------------------------------------
't', 'T'    date/time          Prefix for date and time conversion characters.
                               See Date/Time Conversions. 

…</p>

以下转换字符用于格式化日期:

    'Y'   Year, formatted as at least four digits with leading zeros as necessary, e.g. 0092 equals 92 CE for the Gregorian calendar.
    'm'   Month, formatted as two digits with leading zeros as necessary, i.e. 01 - 13.
    'd'   Day of month, formatted as two digits with leading zeros as necessary, i.e. 01 - 31

我只引用了最后一张表中的 3 个相关条目,还有更多字母。

编辑:顺便说一句,以这种方式获得后一个结果可能更清楚:

    System.out.println(LocalDate.now(ZoneId.of("Europe/Kirov"))
            .format(DateTimeFormatter.BASIC_ISO_DATE));

自从我第一次发布这个答案以来,午夜已经在基洛夫过去了,所以现在输出我们:

20200130

文档链接

Java 格式字符串的文档


推荐阅读