闰年定义:
1.年份能被400整除的是闰年
2.年份非整百且能被4整除的是闰年
几月几号是星期几的问题:
如何在不查日历情况下算出来呢?一种简单的方法是知道某一天是星期几,然后算出目标日期距离那个某一天的天数,推算目标日期的星期。第二种方法是基姆拉尔森计算公式,
计算公式: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
import java.util.Scanner;
public class L6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<20;i++) {
int y=2019;
int m=(int)(Math.random()*12+1);
int d=(int)(Math.random()*30+1);
String a=weekday(y,m,d);
String b=wd(y,m,d);
if(a.equals(b))
System.out.println("true");
else
System.out.println("false");
}
}
public static boolean is_leap_year(int year) {
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
return true;
return false;
}
// y-年,m-月,d-日期
public static String weekday(int y, int m, int d) {
if (m == 1 || m == 2) {
m = m + 12;
y--;
}
int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7;
// System.out.print(week);
if (week == 1)
return "星期一";
if (week == 2)
return "星期二";
if (week == 3)
return "星期三";
if (week == 4)
return "星期四";
if (week == 5)
return "星期五";
if (week == 6)
return "星期六";
if (week == 0)
return "星期七";
return "";
}
public static String wd(int y,int m,int d) {
//0-6表示星期1-7
int ans=0;
for(int i=1;i<y;i++) {
if((i%100!=0&&i%4==0)||i%400==0) {
ans+=366%7;
ans%=7;
}else {
ans+=365%7;
ans%=7;
}
}
for(int i=1;i<m;i++) {
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) {
ans+=31%7;
ans%=7;
}else if(i==4||i==6||i==9||i==11) {
ans+=30%7;
ans%=7;
}else if((y%100!=0&&y%4==0)||y%400==0) {
ans+=29%7;
ans%=7;
}else {
ans+=28%7;
ans%=7;
}
}
ans+=(d-1)%7;
ans%=7;
if(ans==0)return "星期一";
if(ans==1)return "星期二";
if(ans==2)return "星期三";
if(ans==3)return "星期四";
if(ans==4)return "星期五";
if(ans==5)return "星期六";
if(ans==6)return "星期七";
return "";
}
}
结果: