java日期类操作:Date、SimpleDateFormat、Calendar简介

1、Date类简介
Date类是java.util下的一个封装时间和日期信息的类。不过Date类中用于时间分量的计算已经被Calendar类所取代。重点介绍setTime和getTime两个方法。

    public void testDate(){

        //创建一个date对象并打印时间
        Date date = new Date();
        System.out.println(date);

        //date对象调用getTime()方法返回一个long值,返回从1970年1月1日到现在经历的毫秒数
        long time = date.getTime();
        System.out.println(time);

        //增加一天所经历的毫秒数,通过调用setTime()方法可以指定日期
        time += 24*60*60*1000;
        date.setTime(time);
        System.out.println(date);
    }

输出结果如下:
这里写图片描述

getTime()可以获取当前所经历的毫秒数,setTime()可以修改当前时间。由于Date类重写了toString()方法,所以可以直接打印。

2、SimpleDateFormat简介
SimpleDateFormat是java.text下一个类,它允许进行格式转换,即允许日期–>文本和文本–>日期。
常用的构造方法如下有两个:

-SimpleDateFormat()
-SimpleDateFormat(String pattern)   pattern可以指定的日期格式

pattern匹配字符如下:
这里写图片描述

比如我将Date格式转换成为自定义的格式并输出,使用format方法:

    public void testSimpleDateFormat(){
        //自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd E HH:mm:ss");
        Date date = new Date();
        //调用format方法进行转换
        String format = sdf.format(date);
        System.out.println(format);
    }

输出结果为:

这里写图片描述

除此之外,SimpleDateFormat也支持将字符串转换为日期格式,使用parse方法:

    public void testParse(){
        //指定一个日期字符串
        String str = "2017-11-11";
        //匹配字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            //通过parse方法将字符串转换为Date对象
            Date parse = sdf.parse(str);
            System.out.println(parse);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

输出结果为:
这里写图片描述

以上就是Date类和SimpleDateFormat类的简介,下面重点来看Calendar类。

3、Calendar类简介
Calendar是java.util下的一个抽象类,用于封装日历信息,其最大的功能是可以对时间分量进行运算。
Calendar中定义了许许多多的字段,目的是为了获取或者设置一些时间分量,还有两个构造方法以及多个方法。
建立Calendar对象的方式是调用getInstance()方法,它是一个静态方法,通过类名来调用可以直接返回一个Calendar对象。

    public void testCalendar(){
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getClass().getName());
    }

输出结果如下:
这里写图片描述
前面我们提到过,Calendar是一个抽象类,它的子类只有一个,就是GregorianCalendar类,所以上面返回的类名是GregorianCalendar。

下面我们来看通过Calendar来设置日期和时间分量。

    public void testCal() {
        // 创建一个Calendar对象
        Calendar cal = Calendar.getInstance();
        // 设置年月日
        cal.set(Calendar.YEAR, 2017);
        cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
        cal.set(Calendar.DATE, 14);
        // 打印
        System.out.println(cal.getTime());

        //设置一个大于31的日期天数
        cal.set(Calendar.DATE, 32);
        System.out.println(cal.getTime());
    }

输出结果为:
这里写图片描述
阅读如上代码片段,在设置年月日中,用到的Calendar.YEAR、Calendar.MONTH、Calendar.DATE就是之前我们提到过的Calendar类中定义的字段,详细字段可以查看java api文档进一步了解。
在上面我们看到当我设置日期为32时,程序会自动识别到下一个月的对应天数,这是非常便利的。

上面介绍了设置时间分量以后,我们再来看如何获取时间分量,这里也用到了许许多多的字段。

    public void testCal() {
        // 创建一个Calendar对象
        Calendar cal = Calendar.getInstance();
        // 设置年月日
        cal.set(Calendar.YEAR, 2017);
        cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
        cal.set(Calendar.DATE, 14);
        // 打印
        System.out.println(cal.getTime());

        //获取这天是星期几
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);
        System.out.println(dayOfWeek);//输出2
    }

通过调用cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);返回一个int型数,标识这天再该月该周是星期几,这也是DAY_OF_WEEK_IN_MONTH字段的作用。

使用add()方法可以为当前日期增加或者减去相应时间。如:

    public void testCal() {
        // 创建一个Calendar对象
        Calendar cal = Calendar.getInstance();
        // 设置年月日
        cal.set(Calendar.YEAR, 2017);
        cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
        cal.set(Calendar.DATE, 14);
        // 打印
        System.out.println(cal.getTime());

        // 调用add方法,增加一年,减去三个月
        cal.add(Calendar.YEAR, 1);
        cal.add(Calendar.MONTH, -3);

        System.out.println("年:" + cal.get(Calendar.YEAR) + "\n月:"
                + (cal.get(Calendar.MONTH) + 1)); // 由于月是从0开始,所以这里要加1
    }

输出结果为:
这里写图片描述

可以看到,原来的2017年变成了2018,9月份变成了6月份。

4、介绍完上面的三个类以后,我们来看一个例子,摘自某培训机构。
这里写图片描述

在这里附上我的代码:

package com.wisdom.date;

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

public class Promotion {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 获取生产日期
        System.out.println("请输入生产日期:(yyyy-MM-dd)");
        String fromDate = scanner.next();

        // 获取保质期
        System.out.println("请输入保质期:(天数)");
        int days = scanner.nextInt();

        scanner.close();

        // 将字符串生产日期转变为Calendar对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        Date from = null;
        try {
            from = sdf.parse(fromDate);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 将date对象变为Calendar对象,方便对时间分量的操作
        cal.setTime(from);
        cal.add(cal.DATE, days - 14);
        // 获取过期前14天是星期几,这里的星期是以星期天为第一天来算的
        int i = cal.get(Calendar.DAY_OF_WEEK);

        // 所以这边为3-i+1
        cal.add(cal.DATE, 4 - i);

        Date date = cal.getTime();
        System.out.println("促销日期为:" + sdf.format(date));
    }
}

输出结果如下:
这里写图片描述
本人仍在学习路上,欢迎各位读者提出宝贵意见。该回家睡觉了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值