【发布时间】:2020-04-17 22:50:01
【问题描述】:
我正在做以下编程练习:Unlucky Days。声明是:
13 日星期五或黑色星期五被视为不吉利的日子。计算 一年中有多少不吉利的日子。
找出给定年份中的第 13 号星期五。
输入:整数形式的年份。
输出:一年中黑色星期五的数量,以整数表示。
例子:
unluckyDays(2015) == 3 unluckyDays(1986) == 1
首先我尝试了以下代码:
import java.time.*;
import java.time.format.*;
import java.util.Locale;
public class Kata {
public static int unluckyDays/*????????*/(int year) {
System.out.println("\nyear: "+year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/M/dd");
for(int i = 1; i <= 12; i++){
LocalDate date = LocalDate.parse(String.format("%d/%d/13",year,i));
DayOfWeek dow = date.getDayOfWeek();
String output = dow.getDisplayName(TextStyle.FULL, Locale.US);
System.out.println("\noutput: "+output);
}
return 0;
}
}
我们得到以下异常:
java.time.format.DateTimeParseException: Text '2015/1/13' could not be parsed at index 4
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
at java.base/java.time.LocalDate.parse(LocalDate.java:413)
at Kata.unluckyDays(Kata.java:10)
正如我们所见,LocalDate.parse(String.format("%d/%d/13",year,i)); 所用字符串中索引 4 处的“/”是错误的。
然后我决定将格式更改为使用'-'而不是'/'
import java.time.*;
import java.time.format.*;
import java.util.Locale;
public class Kata {
public static int unluckyDays/*????????*/(int year) {
System.out.println("\nyear: "+year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-dd");
for(int i = 1; i <= 12; i++){
LocalDate date = LocalDate.parse(String.format("%d-%d-13",year,i));
DayOfWeek dow = date.getDayOfWeek();
String output = dow.getDisplayName(TextStyle.FULL, Locale.US);
System.out.println("\noutput: "+output);
}
return 0;
}
}
对于前面的代码,抛出的异常是:
java.time.format.DateTimeParseException: Text '2015-1-13' could not be parsed at index 5
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
at java.base/java.time.LocalDate.parse(LocalDate.java:413)
at Kata.unluckyDays(Kata.java:10)
因此,正如我们所见,一位数月份“1”存在困难。
为了继续,我将那些只有一位数字的月份用 0 填充:
import java.time.*;
import java.time.format.*;
import java.util.Locale;
public class Kata {
public static int unluckyDays/*????????*/(int year) {
System.out.println("\nyear: "+year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-dd");
int count = 0;
for(int i = 1; i <= 12; i++){
LocalDate date = LocalDate.parse(String.format("%d-%s-13",year,String.valueOf(i).length() < 2 ? "0"+i : i));
DayOfWeek dow = date.getDayOfWeek();
String output = dow.getDisplayName(TextStyle.FULL, Locale.US);
System.out.println("\noutput: "+output);
if(output.equals("Friday")){
count++;
}
}
return count;
}
}
在这种情况下它可以工作。但是,我们如何在 DateTimeFormatter.ofPattern("yyyy-M-dd"); 中指出月份只能有一位数字。
另外,我们应该怎么做才能使用不同的日期格式,例如:DateTimeFormatter.ofPattern("dd-M-yyyy");
因为我试过了:
import java.time.*;
import java.time.format.*;
import java.util.Locale;
public class Kata {
public static int unluckyDays/*????????*/(int year) {
System.out.println("\nyear: "+year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy");
int count = 0;
for(int i = 1; i <= 12; i++){
LocalDate date = LocalDate.parse(String.format("13-%s-%d",String.valueOf(i).length() < 2 ? "0"+i : i,year));
DayOfWeek dow = date.getDayOfWeek();
String output = dow.getDisplayName(TextStyle.FULL, Locale.US);
System.out.println("\noutput: "+output);
if(output.equals("Friday")){
count++;
}
}
return count;
}
}
输出很有趣:
java.time.format.DateTimeParseException: Text '13-01-2015' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
at java.base/java.time.LocalDate.parse(LocalDate.java:413)
at Kata.unluckyDays(Kata.java:11)
我们观察到“13”几天导致异常,索引为 0,我不明白。
另外我读过:
- How to determine day of week by passing specific date?
- Calculating future occurrences of Friday the 13th
- https://www.geeksforgeeks.org/localdate-parse-method-in-java-with-examples/
我们怎么知道,为什么 LocalDate 解析会抛出异常‽
【问题讨论】:
-
令人印象深刻的研究工作。喜欢。
-
完全不使用字符串可以避免很多麻烦。 LocalDate.of(year, i, 13) 工作得很好。