【问题标题】:Calendar giving unexpected results for year 1第 1 年的日历给出了意想不到的结果
【发布时间】:2017-03-09 21:02:16
【问题描述】:

我尝试在 Java 7 中执行this code-golf challenge。仅针对不知道的人: 是用尽可能少的字节完成某项任务。显然,Java 不是一种合适的编程语言,尤其是像 Jelly 这样的语言; 05AB1E;皮斯;和类似的人在 1-15 字节中完成任务,在 Java 中将是 75-300,但我只是为了好玩。

Here is my current Java 7 answer.仅供参考,我这里也复制一下:

import java.util.*;String c(int y){String r="";Calendar c=Calendar.getInstance();c.set(1,y);c.set(2,0);for(int i=0;i++<11;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}

import java.util.*;
class M{
  static String c(int year){
    String r = "";
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 11; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

输出所有以 1 为索引的月份,其中该月的最后一天是星期一:

1 2 10 **
5 
9 
1 7 
2 10 
1 2 10

当您将我的结果与链接挑战中的结果进行比较时,您可能已经注意到,第 1 年的结果不正确。
有谁知道为什么?最初我认为Calendar.getInstance() 的默认日历不正确,所以我将其更改为挑战中指定的new GregorianCalendar()。但我意识到这已经是默认日历了。

为什么第 1 年的结果不正确?

【问题讨论】:

标签: code-golf java date calendar dayofweek


【解决方案1】:

不幸的是,GregorianCalendar 的名字很糟糕。它实际上是“儒略历/公历,它们之间有一个切换。”

幸运的是,您可以通过将切换设置为在时间开始时将其用作纯公历:

GregorianCalendar calendar = new GregorianCalendar();
calendar.setGregorianChange(new Date(Long.MIN_VALUE));

此时,使用您当前的代码,您得到的答案仅为“4” - 由于一个错误的错误,它没有选择 12...您想要 &lt; 12 而不是 &lt; 11

【讨论】:

  • 啊,我确实知道GregorianCalendar 既是朱利安又是格里高利,但我不知道这实际上是问题的原因,我也不知道setGregorianChange。谢谢!我已将其更改为GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L&lt;&lt;63));,它就像一个魅力。 PS:新头像? :)
猜你喜欢
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
相关资源
最近更新 更多