题目描述
在国外,每月的 13 号和每周的星期 5 都是不吉利的。特别是当 13 号那天恰好是星期 5时,更不吉利。
现在给你一个年份,请你从小到大依次输出当年所有13 号是星期 5 的月份。
输入描述:
输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。
输出描述:
对应每一组数据,输出所有符合条件的月份,月份之间用空格隔开。
如果当年不存在13号是星期五的月份,就输出一行Luck。
输入例子:
2000
2001
2002
输出例子:
10
4 7
9 12
1 package com.hone.basicaltest; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Calendar; 5 import java.util.Locale; 6 import java.util.Scanner; 7 8 9 /** 10 * 原题目:https://www.nowcoder.com/pat/2/problem/359 11 * @author Xia 12 * 找出历史中即是13号又是星期五的日子 13 */ 14 public class basical1029UnluckDay { 15 public static void main(String[] args) { 16 Scanner ss = new Scanner(System.in); 17 while (ss.hasNextLine()) { 18 int year = ss.nextInt(); 19 int flag = 0; 20 for (int i = 0; i <= 11; i++) { 21 String[] weeks = {"","sun","mon","tue","wen","thu","fri","sat"}; 22 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); 23 Calendar cc = Calendar.getInstance(); 24 cc.set(year, i, 13); 25 int w = cc.get(Calendar.DAY_OF_WEEK); 26 if (w == 6) { 27 if (flag == 0) { 28 System.out.print(i+1); 29 flag = 1; 30 }else { 31 System.out.print(" "+(i+1)); 32 } 33 } 34 } 35 if (flag == 0) { 36 System.out.println("Luck"); 37 } 38 39 } 40 41 } 42 }
下面来介绍java中Date以及Calendar的使用:
Date介绍
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。
1、使用Date类代表当前系统时间
1 Date d = new Date();
3 System.out.println(d);
使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下:
但是遗憾的是,Date很多方法都已经被遗弃,现在主要使用功能更强大的Calendar类。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象
Calendar rightNow = Calendar.getInstance(); //用于获取当前实例化的时间
Calendar.getInstance(); 并没有主动继承显示日期的toString()方法,无法直接打印rightNow来获得日期。
具有两个构造方法(都是protected修饰)
Modifier | Constructor and Description |
---|---|
protected |
Calendar()
Constructs a Calendar with the default time zone and the default
FORMAT locale. |
protected |
Calendar(TimeZone zone, Locale aLocale)
Constructs a calendar with the specified time zone and locale.
|
常见的方法:
1:设置日期
void |
set(int year, int month, int date)
Sets the values for the calendar fields
YEAR , MONTH , and DAY_OF_MONTH . |
1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
2 d2.set(2017, 10, 11); //表示2017、11、11
注意:年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。
只设定某一个字段的日期:
void |
set(int field, int value)
Sets the given calendar field to the given value.
|
Calendar d2 = Calendar.getInstance(Locale.CHINA);
d2.set(Calendar.YEAR, 2016);
d2.set(Calendar.MONTH, 10);
d2.set(Calendar.DAY_OF_MONTH, 11); //d2 : 2016/11/11
设置中常见的属性:
Calendar.YEAR——年份
Calendar.MONTH——月份
Calendar.DATE——日期
Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
Calendar.HOUR——12小时制的小时数
Calendar.HOUR_OF_DAY——24小时制的小时数
Calendar.MINUTE——分钟
Calendar.SECOND——秒
Calendar.DAY_OF_WEEK——星期几
2:获取日期
1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
2 d2.set(Calendar.YEAR, 2016);
3 d2.set(Calendar.MONTH, 10);
4 d2.set(Calendar.DAY_OF_MONTH, 11);
5 System.out.println(d2.get(Calendar.YEAR)+"/"+(d2.get(Calendar.MONTH)+1)+"/"+d2.get(Calendar.DAY_OF_MONTH))
//年份
int year = d2.get(Calendar.YEAR);
//月份
int month = d2.get(Calendar.MONTH) + 1;
//日期
int date = d2.get(Calendar.DATE);
//小时
int hour = d2.get(Calendar.HOUR_OF_DAY);
//分钟
int minute = d2.get(Calendar.MINUTE);
//秒
int second =d2.get(Calendar.SECOND);
3:改变日期
abstract void |
add(int field, int amount)
Adds or subtracts the specified amount of time to the given calendar field, based on the calendar's rules.
|
1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
2 d2.set(Calendar.YEAR, 2016);
3 d2.set(Calendar.MONTH, 10);
4 d2.set(Calendar.DAY_OF_MONTH, 11);
5 d2.add(Calendar.YEAR, -1); //年份减一
6 d2.add(Calendar.MONTH, -1); //月份减一
7 d2.add(Calendar.DATE, 1); //日期加一 最终输出 2015/10/12
8 System.out.println(d2.get(Calendar.YEAR)+"/"+(d2.get(Calendar.MONTH)+1)+"/"+d2.get(Calendar.DAY_OF_MONTH));
4:比较日期
boolean |
after(Object when)
Returns whether this
Calendar represents a time after the time represented by the specifiedObject . |
boolean |
before(Object when)
Returns whether this
Calendar represents a time before the time represented by the specified Object . |
Calendar d = Calendar.getInstance(); //得到当前日期
Calendar d2 = Calendar.getInstance(Locale.CHINA);
d2.set(Calendar.YEAR, 2016);
d2.set(Calendar.MONTH, 10);
d2.set(Calendar.DAY_OF_MONTH, 11);
System.out.println(d.after(d2)); //true
5:Calendar对象和Date对象相互转化
首先将Calendar对象转化为Date
Calendar d = Calendar.getInstance(); //得到当前日期 (当前日期为:2017/11/30)
System.out.println(d); //java.util.GregorianCalendar[time=1512040754905.........
Date date = d.getTime();
System.out.println(date); //Thu Nov 30 19:19:14 CST 2017
将Date对象转化为Calendar
1 Date d3 = new Date();
2 System.out.println(d3); //Thu Nov 30 19:24:40 CST 2017
3 Calendar c = Calendar.getInstance();
4 c.setTime(d3);
5 System.out.println(c); //java.util.GregorianCalendar[time=1512041080861....
6
举例:计算小明出生到今天一共有多少天?
假设:小明是2000、10、1出生
1 import java.util.Calendar; 2 /** 3 * 计算小明出生到现在一共多少天? 4 * @author Xia 5 */ 6 public class calendarDay { 7 public static void main(String[] args) { 8 Calendar c = Calendar.getInstance(); 9 Calendar c2 = Calendar.getInstance(); 10 c2.set(2000, 10-1, 1); 11 //全部转化为相对时间 12 long birth = c2.getTimeInMillis(); //按照毫秒为单位 13 long today = c.getTimeInMillis(); 14 15 long day = (today-birth)/(24*60*60*1000); 16 System.out.println(day); 17 } 18 }
更多的内容请参见jdk1.8或者其他版本的API