Calendar及其相关类实现可视化日历

仅作为了解Calendar类的练习和总结

Posted by LJJ on March 12, 2019

简单可视化日历实现

前述:简单作为了解日历类的小练习。

核心内容

  • DateFormate和SimpleDateFormate的使用——时间与字符串的相互转换。
  • Calendar与GregorianCalendar的使用——日期计算。

Calendar类中的常量含义:

  • YEAR(年份)
  • MONTH(月份从0开始,11结束,共12个月)
  • ATE(一月的某天)
  • HOUR(指示上午或下午的小时)
  • HOUR_F_DAY(指示一天中的小时)
  • DAY_OF_WEEK (一个星期中的某天)
  • DAY_OF_MONTH(一个月中的某天)
  • DAY_OF_YEAR(一年中的某天)
  • DAY_OF_WEEK _IN_MONTH(一个月中的第几个星期)
  • WEEK_OF_MONTH (指示当前月中的星期数)
  • WEEK_OF_YEAR(指示当前年中的星期数)

获得Calendar类对象方法:

  • 通过日历类的静态方法获得对象 Calendar c1 = Calendar.getInstance();
  • 通过子类获得对象 Calendar c2 = new GregorianCalendar();

    Calendar类中的一些方法:

  • void set(int field,int value)//field日历类的参数
  • void set(int year,int month,int date)//设置年月日
  • void set(int year, int month, int date, int hourOfDay, int minute, int second)//设置年月日时分秒
  • void setTime(Date date);//使用给定的 Date 设置此 Calendar 的时间
  • int get(int field)//返回给定日历字段的值
  • void add(int field,amont);//为给定的日历字段添加指定的时间

    Date转化成指定的日期格式:

       SimpleDateFormat df1=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
       SimpleDateFormat df2=new SimpleDateFormat("yy/MM/dd HH:mm"); 
       SimpleDateFormat df3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
       SimpleDateFormat df4=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
       SimpleDateFormat df5=new SimpleDateFormat("一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
       Date now=new Date();
       System.out.println(df1.format(now));
       System.out.println(df2.format(now));
       System.out.println(df3.format(now));
       System.out.println(df4.format(now));
       System.out.println(df5.format(now));
       System.out.println(now.toString());
    
  • 得到得结果:

    2019年05月20日 00时47分17秒
    19/05/20 00:47
    2019-05-20 00:47:17
    2019年05月20日 00时47分17秒 周一
    一年中的第 140 天 一年中第21个星期 一月中第4个星期 在一天中24时 CST时区
    Mon May 20 00:47:17 CST 2019

把给定的字符串中的日期提取为Date

    String str = "2019-05-20 00:52:30.345" ;  
    // 第一种格式
    String str1 = "yyyy-MM-dd HH:mm:ss.SSS" ;  
    // 第二种格式
    String str2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;  
    SimpleDateFormat df1 = new SimpleDateFormat(str1) ;         
    SimpleDateFormat df2 = new SimpleDateFormat(str2) ;        
    Date d = null ;  
    try{  
    	//从字符串中提取出日期数字
        d = df1.parse(str) ;   
    }catch(Exception e){            
        e.printStackTrace() ;       
    }  
    System.out.println(d);
    //将提取后的日期数字变为指定的格式
    System.out.println(df1.format(d));
    System.out.println(df2.format(d)) ; 
  • 最终得到结果为:

    Mon May 20 00:52:30 CST 2019
    2019-05-20 00:52:30.345
    2019年05月20日 00时52分30秒345毫秒

日历实现代码

    package cm.stx.calendar;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Scanner;
    
    public class TestCalendar {
    
    	public static void main(String[] args)  {
    		//从键盘输入查询日期		
    		System.out.println("请输入日期(格式:2019-05-20):");
    		Scanner input = new Scanner(System.in);
    		//设置日期格式
    		DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
    		Date date = null;
    		try {
    		    //将字符串转换为日期
    			date = df.parse(input.nextLine());
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		//默认当前时刻,获得日历类对象
    		Calendar c = new GregorianCalendar();
    		//设置输入日期
    		c.setTime(date);
    		int dayInput = c.get(Calendar.DAY_OF_MONTH);
    		int days = c.getActualMaximum(Calendar.DATE);
    		
    		System.out.println("一\t二\t三\t四\t五\t六\t日");
    		
    		c.set(Calendar.DAY_OF_MONTH, 1);
    		
    		for(int i=1;i<c.get(Calendar.DAY_OF_WEEK);i++) {
    			System.out.print("\t");
    		}

​ for(int j=1;j<days;j++) {

    			if(dayInput == c.get(Calendar.DAY_OF_MONTH)) {
    				System.out.print(c.get(Calendar.DAY_OF_MONTH) +"*\t");
    			}else {
    				System.out.print(c.get(Calendar.DAY_OF_MONTH) +"\t");
    			}

​ if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) { System.out.println(); }

    			c.add(Calendar.DAY_OF_MONTH, 1);
    		}
    	}
    }