JavaSE笔记_day12_Math、System、Date、DateFormat、Calendar

435 阅读10分钟

一.Math类

  • 来自于java.lang包 
  • Math数学工具类中,没有提供构造方法,Math中的常量和方法都是使用static修饰的

1.Math类中的静态常量

E : System.out.println(Math.E );
PI: System.out.println(Math.PI);

2.Math类中的常用方法

(1)abs(int i): 	重载方法,求一个数的绝对值
    - 返回值类型 重载..
(2)ceil(double d): 	将小数点全部进位,向上取整
    - 返回值类型 double类型
(3)floor(double d): 	将小数点全部舍掉,向下取整
    - 返回值类型 double类型
(4)max(int a,int b):	重载方法,返回两个值的较大值
    - 返回值类型 重载..
(5)min(int a,int b):	重载方法,返回两个值的较小值
    - 返回值类型 重载..
(6)random():	生成一个随机小数,[0.0,1.0)
    - 返回值类型 double类型
(7)round(double d): 四舍五入

public class MathDemo {
    public static void main(String[] args) {
        mathEle();
        mathMethod();
    }
    public static void mathEle(){
        //math类中的静态常量
        System.out.println(Math.E );//2.718281828459045
        System.out.println(Math.PI);//3.141592653589793
    }
    public static void mathMethod(){
        //1.abs();取绝对值
        System.out.println(Math.abs(-3.14));
        System.out.println(Math.abs(7));

        //2.ceil();向上取整
        System.out.println(Math.ceil(3.01));//4.0
        System.out.println(Math.ceil(-5.5));//-5.0

        //3.floor();向下取整
        System.out.println(Math.floor(6.9));//6.0
        System.out.println(Math.floor(-6.9));//-7.0

        //4.max()、min()
        System.out.println(Math.max(3,8));//8
        System.out.println(Math.min(-5,-10));//-10

        //5.random()
        System.out.println(Math.random());//随机小数
        //生成一个1-100的随机数
        int x = (int)(Math.random()*100)+1;//随机小数可能取0
        System.out.println(x);

        //6.round()
        System.out.println(Math.round(3.55));//4
        System.out.println(Math.round(3.1));//3
    }
}

二.System类

  • 来自于java.lang包,用于描述系统资源的
  • System类中没有提供构造方法,类中常量和方法都时静态的

1.System类中的静态常量

in: 标准的输入流,默认关联键盘录入
    举例:Scanner sc = new Scanner(System.in);
out:标准的输出流,默认将数据输出到控制台上
    System.out.println() --> System:系统类、out:System中的常量,表示输出 
    - 返回值类型PrintStream打印流  Println()重载方法,可打印所有类型。
err:标准的错误流,是error的缩写,将代码运行时异常以及一些错误信息进行输出,以红色的字体进行显示
    - 返回值类型PrintStream打印流 
    运行时异常:代码编译是没有错误,运行时异常

2.System类中的常用方法

(1)gc(): 垃圾回收,但是内存和JVM有自己的内存回收机制,在合适的场景下,系统底层会自动的进行无用对象的垃圾回收。
(2)exit(int static): 停止虚拟机,代码不再运行
(3)currentTimeMillis(): 返回当前时间毫秒值,1000ms = 1s,java中默认的起始时间是1970年1月1日00:00:00 ->毫秒值为0
    - 返回值类型 Long类型

public class SysytemDemo {
    public static void main(String[] args) {
        /*System.out.println(Integer.parseInt("abc"));编译不报错,运行时异常*/

        //exit(0):正常停止虚拟机,代码都停止运行
        System.out.println("helloword");
        System.exit(0);
        System.out.println("hello");

        //currentTimeMillis(); 1970年1月1日00:00:00 --> 2020年3月17日的毫秒值
        long a1 = System.currentTimeMillis();
        System.out.println(a1);//1584439380771
        int count = 0;
        for (int i = 0; i < 10000; i++) {
	    count++;
            count++;
        }
        long a2 = System.currentTimeMillis();
        System.out.println("循环运行时间"+(a2-a1));//循环运行时间0、循环运行时间1  毫秒
    }
}		

三.Date类

1.Date类的概述

  • 来自于java.util包,java.util包中的类,一般都是工具类
  • 表示时间

2.Date类的构造方法

1.Date(): 表示一个日期类对象
2.Date(long time): 获取到指定毫秒值time对应的日期

3.Date类的方法

需要创建对象使用
    1.after(Date d): 测试此日期是否在指定日期之后
        - 返回值类型 boolean类型
    2.before(Date d): 测试此日期是否在指定日期之前
        - 返回值类型 boolean类型
    3.getTime(): 获取当前Date日期类对象的毫秒值,自1970年1月1日0点算起
        - 返回值类型 long类型
    4.setTime(): 将time对应的毫秒值,转换成日期类的对象

import java.util.Date;
public class DateDemo {
    public static void main(String[] args) {
        //1.有一些过时的方法,使用的时候,方法的上面有一条横杠,不是错误
        // Date d1 = new Date("2020-3-17");

        //2.Date(),空参构造
        Date d2 = new Date();
        System.out.println(d2);//Tue Mar 17 20:26:36 GMT+08:00 2020
       
       //3.Date(long time) 获取到指定毫秒值time对应的日期
        Date d3 = new Date(0);
        System.out.println(d3);//Thu Jan 01 08:00:00 GMT+08:00 1970

        //1.d2.after(d3)判断d2是否在参数d3日期之后
        System.out.println(d2.after(d3));//true

        //2.d2.before(d3)判断d2是否在参数d3日期之前
        System.out.println(d2.before(d3));//false

        //3.getTime() 获取当前Date日期类对象的 毫秒值,自1970年1月1日0点起
        System.out.println(d2.getTime());//1584450396098

        //4.setTime(long time) 将time对应的毫秒值,转换成一个日期类对象
        d2.setTime(1584450396098L);
        System.out.println(d2);//Tue Mar 17 21:06:36 GMT+08:00 2020
    }
}

四.DateFormat类

  • 来自于java.text包
  • DateFormat是一个抽象类,不能实例化对象,找到DateFormat子类SimpleDateFormat 
  • DateFormat功能:能进行时间或者日期的格式化,将时间或者日期转换成想要的格式

1.DateFormat类中的方法

1.format(Date d): 将一个日期对象转换成字符串
2.parse(String s): 将字符串s转换成日期对象

2.SimpleDateFormat类的日期格式化

  • Simpledateformat类,来自于java.text包 
  • 与语言无关的将一个日期或是时间进行解析或者是格式化 
  • 父类继承来的

1.format(Date d): 格式化,将一个日期对象转换成字符串
    - 返回值类型 String类型
2.parse(String s): 解析,将字符串s转换成日期对象
    - 返回值类型 Date类型

3.SimpleDateFormat类的构造方法

1.SimpleDateFormat(): 空参构造,带有默认的日期的格式化类型:2020/3/18 下午8:20
2.SimpleDateFormat(String partten): 将日期或时间格式化成pattern的形式
日期的字符串表达方式pattern
    y  -  年
    M  -  月
    d  -  日
    H  -  时
    m  -  分
    s  -  秒
例如:SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {////Add...添加异常说明
        //createSimple();
        getDate();
}
    public static void createSimple(){
        //1.空参构造,带有默认的日期的格式化类型:2020/3/18 下午8:20
        SimpleDateFormat sdf1 = new SimpleDateFormat();//需要导包,java.text.SimpleDateFormat
        String s1 = sdf1.format(new Date());//需要导包,java.util.Date
        System.out.println(s1);
      
      //2.有参构造,将日期或时间格式化成pattern的形式: 2020-03-19 08-44-03
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");//"yyyy年MM月dd日 HH:mm:ss" 斜杠也可
        String s2 = sdf2.format(new Date());
        System.out.println(s2);
    }
    public static void getDate() throws ParseException {//Add...添加异常说明
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");//若不写小时,默认为0
        //1.parse(String s) : 将字符串s转换成一个日期对象,返回值类型Date类型
        //注意:提供的String类型参数,必须与SimpleDateFormat构造方法中的字符串类型保持一致
        //如果字符串无法转换成指定的日期类型,报错ParseException
        Date d = sdf.parse("2020年03月19日");
        System.out.println(d);//Thu Mar 19 00:00:00 GMT+08:00 2020
    }
}

练习:通过键盘录入一个自己的生日,计算今天是自己出生的第几天

分析:
    1.自己生日 -> String类型
        String -> 毫秒值
        String -> Date(SimpleDateFormat  parse() -> (Date getTime()) 拿到生日的毫秒值
    2.获取今天日期对应的毫秒值
        System.currentTimeMillis()	或	new Date().getTime() 
    3.两个毫秒值做差,最终需要天数,毫秒值/1000/60/60/24
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class DateTest {
    public static void main(String[] args) throws ParseException {
        Scanner sc = new Scanner(System.in);
        //1.输入一个生日
        System.out.println("请输入生日(格式2020/03/19): ");
        String birth = sc.next();

        //2.将String类型的生日,转换成Date类型
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date birthDate = sdf.parse(birth);

        //3.将生日的Date类型转换成毫秒值
        long birthTime =  birthDate.getTime();

        //4.将今天的日期转换成毫秒值
        long nowTime = new Date().getTime();

        //5.计算出生天数
    	int day= (int)((nowTime - birthTime)/1000/60/60/24);
        System.out.println(day);
    }
}

五.Calendar类

1.Calendar类的介绍

  • 来自java.util包,表示一个日历类
  • 日历类,可以将日期中相关数据,单独获取到。例如:年份,天数,星期 
  • Calendar类是一个抽象类,不能创建对象 
  • Calendar中,getInstance(): 能获取到一个Calendar抽象类的一个子类对象

2.Calendar类中的get方法

  • get(int field): 获取指定的日历字段值
       返回值类型 int类型

3.Calendar类中的set方法

set(int field,int value): 将日历中的指定字段field,设置为指定的值value(单独设置年月日)
set(int year,int month,int date): 设置日历中的年月日
set(int year, int month, int date, int hourOfDay, int minute) :设置日历中的年月日小时分钟
set(int year, int month, int date, int hourOfDay, int minute, int second):设置日历中的年月日小时分钟秒

4.Calendar类中的add方法

add(int field,int count):给日历类中的指定的字段field添加数值count
说明:如果添加后,field超出范围,进位。举例:现在是十月,添加五个月,要进位到年

import java.util.Calendar;
public class CalendarDemo {
    public static void main(String[] args) {
        //1.getInstance()获取到一个Calendar的子类对象
        //左边抽象父类,右边子类对象
        Calendar cal = Calendar.getInstance();//多态的表现形式
        System.out.println(cal);//打印一个日历类型
        //getMethod();
        //setMethod();
        addMethod();
    }
    public static void getMethod(){
        Calendar cal = Calendar.getInstance();
        //获取指定的日历字段值
        int year = cal.get(Calendar.YEAR);
        System.out.println(year);//2020

        int month = cal.get(Calendar.MONTH)+1;//国外是0-11月
        System.out.println(month);

        int day = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);

        int week = cal.get(Calendar.DAY_OF_WEEK)-1;//国外是周日为第一天
        System.out.println(week);

        int hour = cal.get(Calendar.HOUR_OF_DAY);
        System.out.println(hour);

        int minute = cal.get(Calendar.MINUTE);
        System.out.println(minute);

    	int second = cal.get(Calendar.SECOND);
    	System.out.println(second);
    }
    public static void setMethod(){
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR,2005);
        cal.set(Calendar.DAY_OF_MONTH,23);
        System.out.println(cal.get(Calendar.YEAR) );//2005
        System.out.println(cal.get(Calendar.DAY_OF_MONTH));//23

        cal.set(2007,12,01);//日期超出范围,美国月份(0-11),自动进位,
        System.out.println(cal.get(Calendar.YEAR));//2008
        System.out.println(cal.get(Calendar.MONTH));//0
    	System.out.println(cal.get(Calendar.DAY_OF_MONTH));//1

    	cal.set(2011,06,02,9,22,33);
    	System.out.println(cal.get(Calendar.YEAR)+" "+cal.get(Calendar.MONTH)+" "+cal.get(Calendar.DAY_OF_MONTH));//2011 6 2
    	System.out.println(cal.get(Calendar.HOUR_OF_DAY)+" "+cal.get(Calendar.MINUTE)+" " +cal.get(Calendar.SECOND));//9 22 33
    }
    public static void addMethod(){
        Calendar cal = Calendar.getInstance();//一创建,就获得了当前日期的一个对象
        cal.add(Calendar.YEAR,-2);//2020-2 = 2018
        System.out.println(cal.get(Calendar.YEAR));

    	cal.add(Calendar.MONTH,10);
    	System.out.println(cal.get(Calendar.YEAR));//2019
        System.out.println(cal.get(Calendar.MONTH));//0
    }
}

练习1:键盘录入一个年份,通过月份判断这一年是平年还是闰年。(注意:平年的2月28天,闰年的2月29天)

分析:
    输入年份 int 类型
    设置一个Calendar日历类,设置年份为输入的年份,月份为1,日设置为28,
    闰年29天,平年28天
    日的上面添加一天,如果月份进位,平年。没有进位,闰年
import java.util.Calendar;
import java.util.Scanner;

public class CalendarYear {
    public static void main(String[] args) {
        //创建一个Calendar类对象
        Calendar cal = Calendar.getInstance();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份: ");
        //键盘录入的年份year以及2月28日,设置为日历数据
        int year = sc.nextInt();

        //没过0-11月,数据中的1月相当于中国的2月
        cal.set(year,1,28);

        //将日期做+1的动作
        cal.add(Calendar.DAY_OF_MONTH,1);//日+1

        //如果进位为三月,平年。没有进位仍然为2月,闰年
        int month = cal.get(Calendar.MONTH);
        if(month ==2){
	    System.out.println("平年");
        }else{
            System.out.println("闰年");
        }
    }
}

练习,代码实现以下需求:

   (1)通过键盘录入日期字符串,格式(2015-10-25) 

   (2)输出该日期是星期几及这一年的第几天 

   (3)如输入:2015-10-20.  输出  "2015年-10月-20日 是星期2,是 2015年的第 293天"

分析:将年月日,星期,一年中的天数都单独的获取到,Calendar类可以做到
    String ----> Date(SimpleDateFormat) ----> 毫秒值 ----> Calendar 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class HomeWork2 {
    public static void main(String[] args) throws ParseException {
        //1.键盘录入,获取字符串日期
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个日期,yyyy-MM-dd形式");
        String date = sc.next();

        //2.将String类型日期转换为Date类型,通过SimpleDateFormat类
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	Date da= sdf.parse(date);//SimpleDateFormat将String类型转为Date类型
    
	//3.将Date日期类型转化成毫秒值
    	long hm = da.getTime();

    	//4.将毫秒值转换成Calendar类型
    	Calendar cal = Calendar.getInstance();//创建一个Calendar对象
    	cal.setTimeInMillis(hm);//用给定的 long 值设置此 Calendar 的当前时间值
    
	//5.将需要的日期字段类型获取到
    	int year = cal.get(Calendar.YEAR);
        int Month = cal.get(Calendar.MONTH)+1;
    	int day = cal.get(Calendar.DAY_OF_MONTH);
    	int week = cal.get(Calendar.DAY_OF_WEEK)-1;
    	int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
    	System.out.println(year+"年-"+Month+"月-"+day+"日 是星期"+week+",是 "+year+"年的第 "+dayOfYear+"天");//2015年-10月-20日 是星期2,是 2015年的第 293天
    }
}