2021-11-12Date类

1.毫秒值的概念和作用

在这里插入图片描述

2.Date类的构造方法和成员方法

Demo02Date.java

package Date;

import java.util.Date;

public class Demo02Date {
    public static void main(String[] args) {
        //1.构造方法Date,分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
        Date date1 = new Date();
        System.out.println(date1);//Fri Nov 12 20:13:28 CST 2021

        //2.Date(long date)分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,
        // 即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
        Date date2 = new Date(17779999L);
        Date date3 = new Date(0L);
        System.out.println(date2);//Thu Jan 01 12:56:19 CST 1970
        System.out.println(date3);//Thu Jan 01 08:00:00 CST 1970

        //3.getTime()
        //          返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
        Date date4 = new Date();
        System.out.println(date4.getTime());//1636719470013

    }
}

3.DateFormat类和SimpleFormat类

在这里插入图片描述在这里插入图片描述
Demo01DateFormat.java

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

public class Demo01DateFormat {
    public static void main(String[] args) throws ParseException {
        //1.使用DateFormat类中的format方法,把日期格式化为文本
        //String format(Date date) 按照指定格式,把Date日期,格式化为符合模式的字符串
        /*
        * 使用步骤:
        *   1.创建SimpleDateFormat对象,构造方法中传递指定的模式
        *   2.调用SimpleDateFormat对象中的方法format(parse),按照构造方法中指定的模式,把Date日期格式化为复合模式的字符串(文本)
        *   把符合构造方法中模式的字符串,解析为Date日期
        * */

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String format = simpleDateFormat.format(date);
        System.out.println(date);//Sat Nov 13 10:43:05 CST 2021
        System.out.println(format);//2021-11-13 10:43:05

        /*2.使用DateFormat类中的方法parse,把文本解析为日期
        * Date parse(String source) 把符合模式的字符串,解析为Date日期
        * 注意:
        *   public Date parse(String source) throws ParseException
        *   parse方法声明了一个异常叫ParseException解析异常
        *   如果字符串和构造方法中的模式不一样,那么程序就会抛出此异常
        *   调用一个抛出了异常的方法,就必须处理这个异常,要么throws继续声明抛出这个异常,呀么try...catch自己处理这个异常
        * */
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = sdf.parse(format);
        System.out.println(parse);

    }
}

4.练习

DatePract.java

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

//使用日期相关的API,计算出一个人已经出生了多少天

/*
* 思路:
*   1.使用Scanner类中的方法next,获取出生日期
*   2.使用DateFormat类中的方法parse,把字符串的出生日期解析为Date格式
*   3.把Date格式的出生日期转换为毫秒值
*   4.获取当前的日期,转换为毫秒值
*   5.使用当前日期的毫秒值-出生日期的毫秒值
*   6.把毫秒值的差值转换为天(s/1000/60/60/24)(注意刚开始自己还除以365,不对的!!!!)
* */
public class DatePract {
    public static void main(String[] args) throws ParseException {
        Date dateNow = new Date();
        System.out.println("现在时间是:" + dateNow);
        Long dataNew = dateNow.getTime();

        System.out.println("请输入你的出生日期:");
        //String dateBorn = new Scanner(System.in).next("yyyy-MM-dd HH:mm:ss");
        String dateBorn = new Scanner(System.in).next();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Long dateOld = sdf.parse(dateBorn).getTime();
        
        int days = (int) ((dataNew - dateOld) / ( 24 * 60 * 60 * 1000));
        System.out.println(days);//8799
    }
}

5.Calendar类

Date的很多类已经不用了,常用Calendar类来代替在这里插入图片描述

6.Calendar类常用的成员变量方法

Demo02Calendar.java

package Calender;

import java.util.Calendar;

/*
 *   Calendar类的成员方法:
 *       -public int get(int field):返回给定日历字段的值
 *       -public void set(int field,int value):将给定的日历字段设置为给定值
 *       -public abstract void add(int field, int amount):根据日历规则,为给定的日历字段添加或减去指定的时间量
 *       -public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象
 *   成员方法的参数:
 *       int field :日历类的字段,可以用Calendar类的静态变量获取
 * */
public class Demo02Calendar {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        System.out.println(year);

        int month = c.get(Calendar.MONTH) + 1;//西方月份0-11,中国1-12
        System.out.println(month);

        int day = c.get(Calendar.DATE);//DAY_OF_MONTH一样效果
        System.out.println(day);

        /*2.
        * public void set(int field, int value):将给定的日历字段设置为给定值
        * 参数:
        *   int field:传递指定的日历字段(YEAR,MONTH)
        *   int value:传递的字段设置的具体的值
        * */
        c.set(Calendar.YEAR,2010);
        System.out.println(c.get(Calendar.YEAR));//2010
        //同时设置年月日,可以使用set的重载方法
        //c.set(8888,8,8);

        //3.-public abstract void add(int field, int amount):根据日历规则,为给定的日历字段添加或减去指定的时间量
        c.add(Calendar.YEAR,+2);
        System.out.println(c.get(Calendar.YEAR));//2012

        c.add(Calendar.YEAR,-2);
        System.out.println(c.get(Calendar.YEAR));//2010

        //4.public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象
        //日历对象转化为日期对象
        System.out.println(c.getTime());//Sat Nov 13 19:14:04 CST 2010
    }
}
//2021
//11
//13

7.时间日期相关类总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个简单的日期Date的实现,包含了年、月、日三个数据成员和友元函数重载自增运算符(++),实现日期的自增。 ```c++ #include<iostream> using namespace std; class Date{ private: int year; int month; int day; public: Date(int y=0, int m=0, int d=0):year(y), month(m), day(d){ } friend Date operator++(Date &d, int); friend ostream& operator<<(ostream& os, const Date& d); }; Date operator++(Date &d, int){ Date temp(d); if(d.day == 31 && (d.month == 1 || d.month == 3 || d.month == 5 || d.month == 7 || d.month == 8 || d.month == 10 || d.month == 12)){ d.day = 1; if(d.month == 12){ d.month = 1; d.year++; }else{ d.month++; } }else if(d.day == 30 && (d.month == 4 || d.month == 6 || d.month == 9 || d.month == 11)){ d.day = 1; d.month++; }else if(d.day == 28 && d.month == 2 && ((d.year % 4 != 0) || (d.year % 100 == 0 && d.year % 400 != 0))){ d.day = 1; d.month++; }else if(d.day == 29 && d.month == 2 && ((d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0))){ d.day = 1; d.month++; }else{ d.day++; } return temp; } ostream& operator<<(ostream& os, const Date& d){ os<<d.year<<"-"<<d.month<<"-"<<d.day; return os; } int main(){ int y, m, d; cout<<"请输入年、月、日:"; cin>>y>>m>>d; Date date(y, m, d); cout<<"今天是:"<<date<<" "; date++; cout<<"明天是:"<<date<<endl; return 0; } ``` 运行结果: ``` 请输入年、月、日:2021 1 12 今天是:2021-1-12 明天是:2021-1-13 ``` 特殊情况: 如果输入的是2020-12-31,那么输出的应该是2021-1-1。我们可以在重载自增运算符中对这种情况进行特判处理,代码如下: ```c++ #include<iostream> using namespace std; class Date{ private: int year; int month; int day; public: Date(int y=0, int m=0, int d=0):year(y), month(m), day(d){ } friend Date operator++(Date &d, int); friend ostream& operator<<(ostream& os, const Date& d); }; Date operator++(Date &d, int){ Date temp(d); if(d.day == 31 && (d.month == 1 || d.month == 3 || d.month == 5 || d.month == 7 || d.month == 8 || d.month == 10 || d.month == 12)){ d.day = 1; if(d.month == 12){ d.month = 1; d.year++; }else{ d.month++; } }else if(d.day == 30 && (d.month == 4 || d.month == 6 || d.month == 9 || d.month == 11)){ d.day = 1; d.month++; }else if(d.day == 28 && d.month == 2 && ((d.year % 4 != 0) || (d.year % 100 == 0 && d.year % 400 != 0))){ d.day = 1; d.month++; }else if(d.day == 29 && d.month == 2 && ((d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0))){ d.day = 1; d.month++; }else{ d.day++; } return temp; } ostream& operator<<(ostream& os, const Date& d){ os<<d.year<<"-"<<d.month<<"-"<<d.day; return os; } int main(){ int y, m, d; cout<<"请输入年、月、日:"; cin>>y>>m>>d; Date date(y, m, d); cout<<"今天是:"<<date<<" "; date++; if(date.day == 1 && date.month == 1){ cout<<"明天是:"<<date.year<<"-"<<date.month<<"-"<<date.day<<endl; }else{ cout<<"明天是:"<<date<<endl; } return 0; } ``` 运行结果: ``` 请输入年、月、日:2020 12 31 今天是:2020-12-31 明天是:2021-1-1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值