private int getFirstDayOfYear(int year){ //计算每年的第一天
int leapYears; 
int hundreds;
int fourHundreds; 
int first;
  if (year < 1582) { //如果年份小于1582年
  return (-1); //返回-1
  } 
  leapYears = (year - 1581) / 4;
  hundreds = (year - 1501) / 100;
  leapYears -= hundreds;
  fourHundreds = (year - 1201) / 400; 
  leapYears += fourHundreds;
  first=5 + (year - 1582) + leapYears % 7; //得到每年第一天
  return first; 
 } 
请帮忙解释下这段代码 是怎么计算一年的第一天的 主要是算法哈!为什么要以1581做标准呢?

解决方案 »

  1.   


    我在《时标与历法》中介绍过儒略历、儒略日(JD)和简化儒略日(MJD),这里就不再重复。只是简单说明一下公历的不连续性。公元1582年3月1日,罗马教皇格里高利十三世在颁布格里高利历(即我们现在使用的公历)时,为了消除已经存在的误差,宣布去掉1582年10月5日至14日。即1582年10月4日的23:59的下一秒是1582年10月15日的00:00。我们通常对1582年10月15日0时之后的时间使用格里高利历,对1582年10月4日的23:59之前的时间使用儒略历。这里的儒略历是指屋大维改革过的儒略历,即奥古斯都历。它和格里高利历除了置闰方式不同,其它是完全一样的。儒略历是4年一闰,400年100 闰。公历是400年97闰,扣掉了3个不能被400整除的世纪年。例如:香港天文台说儒略日“以倒推到公元前4713年1月1日格林尼治平时正午为起算日期”。这里的公元前4713 年1月1日就是按照儒略历倒推的日期。但没有必要特殊说明儒略历。本文提供的mjd2cal、cal2mjd、jd2cal、cal2jd函数都使用了规则:公元1582年10月4日24:00点之前使用儒略历,公元1582年10月15日00:00点之后使用格里高利历。下面是一些使用示例:
      

  2.   

    历法我是知道了,但是还是不懂这里面
    leapYears += fourHundreds; 
    first=5 + (year - 1582) + leapYears % 7; 
    尤其是下面一句代码的意思!