我希望获得与特定日期,一天中的一周和一个月相关的年份。我有可能从这种模式中获得多年。假设日期是15,月份是8月,星期几是星期二那么,我怎样才能找到有效的年份?有这个公式吗?
答案 0 :(得分:3)
这会完全解决您的问题吗?
这背后的想法:
(直到达到指定的MAX_DATE为止)
List<Integer> validYears = new ArrayList<>();
LocalDate date = LocalDate.of(0, Month.AUGUST, 15);
while (date.getYear() < 2015) {
if (date.getDayOfWeek() == DayOfWeek.TUESDAY) {
validYears.add(date.getYear());
}
date = date.plusYears(1);
}
validYears.forEach(year -> System.out.println(year));
编辑: 如果您的日期是2月29日,您应该添加以下代码(因为如果您将1年添加到0000-02-29,它将为您提供0001-02-28,从那里您将留在第28位)
if (date.isLeapYear()) { //And date was feb. 29
date = date.withDayOfMonth(29);
}
以下是带有流的版本:
int day = 29;
Month month = Month.FEBRUARY;
List<LocalDate> collect = IntStream.range(0, 2016).filter(year -> day <= LocalDate.of(year, month, 1).lengthOfMonth())
.mapToObj(year -> LocalDate.of(year, month, day)).filter(date -> date.getDayOfWeek() == DayOfWeek.TUESDAY)
.collect(Collectors.toList());
collect.forEach((year -> System.out.println(year)));
答案 1 :(得分:3)
这是一个简单的公式,你甚至可以在脑海里做。你可以在这里找到更多信息:How to determine the day of the week, given the month, day and year
答案 2 :(得分:2)
这个问题与经典的Dommsday算法有关 一种简单的计算方法是Kraitchik的方法。
Kraitchik方法 -
w = d + m + c + y mod 7,
其中w是星期几(从星期日的1开始向上计数而不是高斯的版本中的0);
d,m,c和y是数字,取决于日期,月份和年份,如下表所示:
Month 1 2 3 4 5 6 7 8 9 10 11 12
m 1 4 3 6 1 4 6 2 5 0 3 5
对于公历,请选择一年中的世纪(例如,1986年将是1900年,2014年将是2000年)。
[Century / 100] mod 4:0 1 2 3
c:0 5 3 1
对于朱利安历法,
[Century / 100] mod 7:0 1 2 3 4 5 6
c:5 4 3 2 1 0 6
最后,年份编号从该表中获得(从1月或2月的日期中减去1):
年份的最后两位数y
00 06 17 23 28 34 45 51 56 62 73 79 84 90 0
01 07 12 18 29 35 40 46 57 63 68 74 85 91 96 1
02 13 19 24 30 41 47 52 58 69 75 80 86 97 2
03 08 14 25 31 36 42 53 59 64 70 81 87 92 98 3
09 15 20 26 37 43 48 54 65 71 76 82 93 99 4
04 10 21 27 32 38 49 55 60 66 77 83 88 94 5
05 11 16 22 33 39 44 50 61 67 72 78 89 95 6
那就是它。您可以从维基百科获取更多背景详细信息
答案 3 :(得分:0)
这是Java 8中使用LocalDate解析器为您完成工作的一种方法。当我有一堆没有年份但是当年或下一年的日期时,我使用了此版本的修改版本。
String dateString = "Mon Dec 23";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM d yyyy");
Integer startYear = 2000;
Integer endYear = 3000;
List<Integer> validYears = new ArrayList<>();
for(int i = startYear; i <= endYear; i++){
try{
LocalDate localDate = LocalDate.parse(dateString + " " + i, formatter);
validYears.add(localDate.getYear());
} catch (Exception e){
//Years that are not valid
}
}
for(Integer year: validYears){
System.out.println(year);
}