Java-Object类、Date类、Calendar类

Object类

Object类是所有类的父类,如果一个类没有指定父类,那么则默认继承自Object类

最常用的两个方法
toString方法:
public static void main(String[] args) {
	//Person类默认继承Object类,所以可以使用其中toString的方法
	Person person = new Person("张三",18);
	String s = person.toString();
	//打印对象的名字,其实就是调用对象的toString()方法,即System.out.println(person); == System.out.println(person.toString);
	System.out.println(s);	
	//未重写toString方法,打印出来的是:Demo03.Person@1540e19d,地址值
    //重写toString方法后,打印出来的就是下方toString中的值
}

//在Person类中,重写toString方法
@Override
public String toString() {
	return "Person{" +
		"name='" + name + '\'' +
		", age=" + age +
		'}';
}

/*看一个类是否重写了toString方法,直接打印这个类对应的对象名字就可以
	如果没有重写toString方法,那么打印的就是地址值,如果有重写那么打印就按照重写的方式打印*/
equal方法:
public static void main(String[] args) {
	Person p1 = new Person("迪丽热巴",18);
	Person p2 = new Person("古力娜扎",20);
    Person p3 = new Person("迪丽热巴",18);
    //p1 = p2;	当存在该语句是,p1,p2就相等
	System.out.println(p1.equals(p2));  //false
    System.out.println(p1.equals(p3));  //false
    //对于引用类型,比较的是地址值而不是内容的值,所以都是false,每一个对象都是new了一个新的对象,所以存储的地址不同
}

//由于Object类的equal方法默认的是比较两个对象的地址值而不是内容的属性值,所以需要重写equal方法,比较不同的属性值是否相同


//Person类中重写equal方法,自己重写的euqal方法
@Override
    public boolean equals(Object obj) {
        if (obj == this){
            return true;
        }

        if (obj == null){
            return false;
        } else if (obj instanceof Person){
            Person p = (Person)obj;
            boolean b = this.name.equals(p.name) && this.age == age;
            return b;
        }else{
            return false;
        }
}

//系统的equal方法
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }
Object中的equals方法和Objects中equals方法的区别:
String a = "abc";
String b = "aaa";
System.out.println( a.equals(b) );	//false
//Object中的equals方法,对于非空的值基本对象没有什么问题,但是一旦a或者b中,有一个的值为null,那么就会报错

Objects.equals(a,b);
//而对于Objects中的equals方法,则不会去关注值是否为零
Date类

Date表示特定的瞬间,精确到毫秒。

毫秒:千分之一秒,一千毫秒等于一秒

毫秒值的作用,可以对时间和日期进行计算

时间原点(0毫秒): 1970 年 1 月 1 日 00:00:00 (英国格林威治)

日期转换为毫秒,其实就是计算日期相对于时间原点有多少毫秒:

System.out.println(System.currentTimeMillis()); //获取当前系统时间的毫秒值

毫秒转换为日期

1 天 = 24 × 60 × 60 = 86400 秒 = 86400000 毫秒

注意:中国俗语东八区,会把时间增加8个小时,中国:1970 年 1 月 1 日 00:08:00

Data类的构造方法和成员方法:
Date date = new Date(); //Date的空参数构造方法,就是获取当前系统的日期和时间
System.out.println(date);	//Sat Nov 09 17:02:29 CST 2019

Date date1 = new Date(1000L);    //Date(long date),带参数的构造方法,返回的是从1970 年 1 月 1 日 00:00:00开始,经过long date毫秒后的时间
System.out.println(date1);	//Thu Jan 01 08:00:01 CST 1970

Date date3 = new Date();	//Date的成员方法
System.out.println(date3.getTime());
//long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
//和System.out.println(System.currentTimeMillis());一模一样
DateFormat类

DateFormat,是日期/时间格式化子类的抽象类,不能直接使用

要用他的子类:SimpleDateFormat(SimpleDateFormat extends DateFormat)

因为返回的是一个字符串类型的数据,所以属于text:java.text.DateFormat

格式化:按照指定的格式,从Date对象转换为String对象(日期 转 文本)

解析:按照指定的格式,从String对象转换为Date对象(文本 转 日期)

成员方法:

String format(Date date) 将一个 Date 格式化为日期/时间字符串
Date parse(String sourse) 把符合模式的字符串,解析为Date日期

SimpleDateFormat的构造方法

SimpleDateFormat(String pattern)用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

参数:String pattern,传递的指定的格式

日期和时间模式结果
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700

SimpleDateFormat(String pattern)使用方法:

  1. 创建SimpleDateFormat对象,构造方法中传递指定的模式
  2. 调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date格式化为符合模式的字符串
package Demo03;

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

public class DateDemo {
    public static void main(String[] args) {
        demo01();
        try {
            demo02();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    /*
    SimpleDateFormat(String pattern)使用方法:
        1. 创建SimpleDateFormat对象,构造方法中传递指定的模式
        2. 调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date格式化为符合模式的字符串
    */
    private static void demo01() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        Date date = new Date();
        String text = sdf.format(date);
        System.out.println(date);	//Sun Nov 10 14:04:26 CST 2019
        System.out.println(text);	//2019-11-10T14:04:26.863+0800
    }

    private static void demo02() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        Date date = sdf.parse("2019-11-09T17:35:38.288+0800");
        System.out.println(date);	//Sat Nov 09 17:35:38 CST 2019
    }
}

练习

计算一个人已经出生了多少天

  1. 使用scnner获取出生日期
  2. 使用DateFormat中的parse方法,把出生日期转换为Date格式
  3. 把Date格式的出生日期转换为毫秒值
  4. 获取当前日期的毫秒值
  5. 使用当前日期的毫秒值减去出生日期的毫秒值
  6. 把毫秒值转换为天
package Demo03;

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

public class Birthday {
    public static void main(String[] args) throws ParseException {
        Date noDate = new Date();

        System.out.println("请输入你的出生日期,格式为yyyy-MM-dd:");
        Scanner sc = new Scanner(System.in);
        String birthDay = sc.next();    //按照指定格式输入出生日期

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(birthDay);    //利用parse方法将字符串格式转换为Date格式

        long now = noDate.getTime();    //获取现在时间的毫秒值
        long birth = date.getTime();   //获取出生日期的毫秒值
        long x = now - birth;   //获取两者的差值

        long day = x/86400000;

        System.out.println("您已出生:"+day+"天!");


    }
}
Calendar类

日历类,里面提供了很多操作日历字段的方法,如YEAR、MONTH、DAY_OF_MONTH、HOUR 等

由于Calendar是一个抽象类,无法直接创建对象,里面有一个静态方法叫做getInstance(),该方法返回了Calendar类的子类对象

static Calendar getInstance() :使用默认时区和语言环境获得一个日历。

package Demo03;

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        System.out.println(c);
    }
}

//java.util.GregorianCalendar[time=1573368059979,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=3,DAY_OF_MONTH=10,DAY_OF_YEAR=314,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=40,SECOND=59,MILLISECOND=979,ZONE_OFFSET=28800000,DST_OFFSET=0]
Calendar类常用的成员方法:

int field:日历类的字段,可以通过静态变量进行获取,例如:Calendar.YEAR

  1. int get(int field) 返回给定日历字段的值

    Calendar c = Calendar.getInstance();//本人运算时间2019/11/10
    System.out.println(c.get(Calendar.YEAR));//返回年:2019
    System.out.println(c.get(Calendar.MONTH));//返回月:10(月份是从0开始计算)
    System.out.println(c.get(Calendar.DATE));//返回日:10
    
  2. void set(int field, int value) 将给定的日历字段设置为给定值。

    Calendar c = Calendar.getInstance();//本人运算时间2019/11/10
    c.set(Calendar.YEAR,2018);//将今年设置为2018年
    //c.set(1999,12,31);set的重载方法,可以同时设置三个值
    System.out.println(c.get(Calendar.YEAR));//输出2018
    
  3. abstract void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。

    //通过amount的正负来确定是增加还是减少
    Calendar c = Calendar.getInstance();	//现在时间为2019/11/10
    c.add(Calendar.YEAR,2);	//将年加2年
    System.out.println(c.get(Calendar.YEAR));	//2021
    c.add(Calendar.MONTH,-3);	//将月份减3
    System.out.println(c.get(Calendar.MONTH));	//7
    c.add(Calendar.DATE,6);	//天数增加6
    System.out.println(c.get(Calendar.DATE));	//16
    
  4. Date getTime() 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。

    把日历对象转换为日期对象

    Calendar c = Calendar.getInstance();
    System.out.println(c.getTime());//Sun Nov 10 15:11:50 CST 2019
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值