1. 标题: 世纪末的星期
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。 还有人称今后的某个世纪末的12月31日,如果是星期一则会…
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)
在做题之前,先学习Calendar这个类
Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
成员方法:
> public static Calendar getlnstance()
public int get(int field)
public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
public final void set(int year,int month,int date):设置当前日历的年月日
重点:
-
实例:Calendar的getInstance方法返回一个Calendar对象,该对象的日历字段已与当前的日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
} -
日历字段可以用三种方法改变:set() 、 add() 、poll()
-
Year:对于 get和 set指示年场数。
-
Mouth:January 为0,所以 [ 0,11 ]
-
DAY_OF_MONTH:对于 get和 set显示该月的一天。月的第一天有价值1。
-
DAY_OF_WEEK: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,和 SATURDAY。分别对应:1,2,3,4,5,6,7
-
HOUR:12小时时钟(0 - 11)。中午和午夜的代表0,而不是12
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
for (int year = 1999;; year += 100) {
calendar.set(Calendar.YEAR, year);// 要找year
calendar.set(Calendar.MONTH, 11);// 12个月,第一个月从0开始因为我们要找的是12月
calendar.set(Calendar.DAY_OF_MONTH, 31);// 月份第一天为1,我们要找的是31号
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
// 如果该年的12月31日是星期天(星期天为1)
System.out.println(year);
break;
}
}
答案:2299
补充题:
1.算一下你来到世界上多少天
写法一:
public class MyYear {
public static void main(String[] args) throws ParseException {
// 键盘录入你的出生的年月日
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的出生年月日:");
String line = sc.nextLine();
// 把该字符串转换为一个日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(line);
// 通过该日期得到一个毫秒值
long myTime = d.getTime();
// 获取当前时间的毫秒值
long nowTime = System.currentTimeMillis();
// 得到一个差值
long time = nowTime - myTime;
// 把差值转换为年
double day = time / 1000 / 60 / 60 / 24;
System.out.println("你来到这个世界:" + day + "天");
}
}
控制台输入的时候注意是:yyyy-mm-dd的形式,不然会出错!
写法二:
我自己写的方法:
避坑避雷!!!默念三遍:month是从0开始的!month是从0开始的!month是从0开始的!
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 键盘录入你的出生年月日
Scanner input = new Scanner(System.in);
System.out.println("请输入你的出生年月日:");
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
// 得到一个毫秒值
calendar.set(year, month - 1, day);
Date date = calendar.getTime();
long myTime = date.getTime();
long nowTime = System.currentTimeMillis();
long time = nowTime - myTime;
double days = time / 1000 / 60 / 60 / 24;
System.out.println("你来到这个世界:" + (long) days + "天");
}
此外,还有一个坑,我们如果用第一种方法写,其中的
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
一定要这样写,不能写成yyyy-mm-d,数据会错的,原因是:每个字母,就算是同一个字母的大小写,都有对应的含义。不能随便写的。
2.获取任意一年的二月有多少天
public static void main(String[] args) throws ParseException {
// 输入任意年份
// 设置日历对象的年月日
// 把时间往前推一天,就是2月的最后一天
// 输出这一天
// 键盘录入你的出生年月日
Scanner input = new Scanner(System.in);
int year = input.nextInt();
Calendar calendar = Calendar.getInstance();
calendar.set(year, 2, 1);
calendar.add(Calendar.DATE, -1);
System.out.println(calendar.get(Calendar.DATE));
}
end.