如何从给定日期,星期几和月份获得所有可能的年份?

时间:2015-07-10 07:07:39

标签: date math formula

我希望获得与特定日期,一天中的一周和一个月相关的年份。我有可能从这种模式中获得多年。假设日期是15,月份是8月,星期几是星期二那么,我怎样才能找到有效的年份?有这个公式吗?

4 个答案:

答案 0 :(得分:3)

这会完全解决您的问题吗?

这背后的想法:

  • 从特定日期(8月15日)开始,从0年开始
  • 如果日期在指定的工作日 - >将其添加到您的列表中
  • 添加1年
  • 返回广场1

(直到达到指定的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

  1. 取一年的最后两位数字。
  2. 除以4,丢弃任何分数。
  3. 添加当天的日期。
  4. 添加月份的关键值:JFM AMJ JAS OND 144 025 036 146
  5. 减去闰年1月或2月的1。
  6. 对于公历日期,为1900年代增加0,为2000年代增加6,为1700年代增加4,为1800年代增加2;对于其他年份,加上或减去400的倍数。
  7. 对于朱利安日期,为1700&s添加1,为每回溯一个世纪添加1。
  8. 添加年份的最后两位数字。
  9. 除以7并取余数。

答案 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);
    }