Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何从给定的日期、星期几和月份获取所有可能的年份?_Date_Math_Formula - Fatal编程技术网

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

Date 如何从给定的日期、星期几和月份获取所有可能的年份?,date,math,formula,Date,Math,Formula,我想得到与特定日期、一天中的一周和一个月相关的一组年份。我有可能从这个模式中获得不同的年份。假设日期是15,月份是8月,一天中的一周是星期二,那么我如何找到有效的年份?这有一个公式吗?这能完全解决你的问题吗 其背后的理念是: 从第0年的特定日期(8月15日)开始 如果日期在指定的工作日-->请将其添加到列表中 加1年 回到原点1 (直到达到您指定的最长日期) 以下是一个包含流的版本: int day = 29; Month month = Month.FEBRUARY; List<Lo

我想得到与特定日期、一天中的一周和一个月相关的一组年份。我有可能从这个模式中获得不同的年份。假设日期是15,月份是8月,一天中的一周是星期二,那么我如何找到有效的年份?这有一个公式吗?

这能完全解决你的问题吗

其背后的理念是:

  • 从第0年的特定日期(8月15日)开始
  • 如果日期在指定的工作日-->请将其添加到列表中
  • 加1年
  • 回到原点1
(直到达到您指定的最长日期)

以下是一个包含流的版本:

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)));
int-day=29;
月=月。二月;
List collect=IntStream.range(0,2016)。过滤器(年->天LocalDate.of(年、月、日))。过滤器(日期->日期.getDayOfWeek()==DayOfWeek.周二)
.collect(Collectors.toList());
collect.forEach((年->系统输出.println(年));

这里有一个简单的公式,你甚至可以在头脑中使用。你可以在这里找到更多信息:

  • 以年份的最后两位数为例
  • 除以4,丢弃任何分数
  • 添加月份的日期
  • 添加当月的关键值:JFM AMJ JAS OND 144 025 036 146
  • 闰年的1月或2月减去1
  • 对于公历日期,1900年加0,2000年加6,1700年加4,1800年加2;对于其他年份,加上或减去400的倍数
  • 对于朱利安的日期,1700年加1,再往回每增加一个世纪加1
  • 将年份的最后两位数相加
  • 除以7,取余数

  • 这个问题与经典的DOMMDAY算法有关。
    一种简单的计算方法是Kraitchik方法

    Kraitchik方法-
    w=d+m+c+y模式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:0531

    对于儒略历,
    [Century/100]mod 7:01 2 3 4 5 6
    c:54326

    最后,从该表中获得年份号(从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


    就这样。您可以从wikipedia获得更多的背景详细信息,以下是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);
        }
    
    String dateString=“Mon-Dec 23”;
    DateTimeFormatter formatter=模式的DateTimeFormatter.of(“E MMM d yyyy”);
    整数startYear=2000;
    整数endYear=3000;
    List validears=new ArrayList();
    
    对于(int i=startYear;i我无法阅读该表。可能移动应用程序中丢失了格式设置。如果没有,您能否详细说明?有关此主题的详细信息可在上获得。在您的特定情况下,您需要进行修改,因为您需要查找年份。可能还需要运行一个循环几个世纪。
    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   
    
        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);
        }