【Java】基于util包的日期时间

本文主要讲解在JDK1.8以前,Java对于日期时间的相关API。尽管现在已经有了新的API(java.time包),但对于java.util包中的日期时间API依然应用广泛,仍然具有学习的意义。此外,只有了解了util包中的API工作方式、缺陷之处,对于学习java.time包中的日期时间具有指导、借鉴意义。

本文的主要内容:

  • 日期时间Date类
  • 数据格式化SimpleDateFormat类
  • 日历Calendar类

目录

Date类

SimpleDateFormat类

Calendar类


Date类

所在的包:java.util.Date

核心原理:通过查看源码,发现其构造方法是调用System.currentTimeMillis()方法获得long类型整数日期(距离格林尼治时间——1970年1月1日0点的毫秒数,这个时间是为了纪念UNIX诞生);

构造方法(现在没有过时的就只有两个):

  1. Date() :创建的是一个表示当前系统时间的Date对象
  2. Date(long date) :根据"指定时间"创建Date对象

常用方法(目前未过时):Date类因为2000年出现的千年虫问题,导致该类很多方法过时,无法使用;

  1. getTime(); 返回 1970年1月1日00:00到当前系统时间经历的毫秒数
  2. setTime(); 设置 1970年1月1日00:00到time 的时间点

第一个Date实例

import java.util.Date;

public class TestDate {
	public static void main(String[] args) {
		Date date = new Date();
		System.out.println(date); //输出:Mon Aug 31 10:31:05 CST 2020
		System.out.println(date.getTime()); //输出:1598841065038
	}
}

SimpleDateFormat类

背景:

  1. 由于Date创建的日期对象显示的结果不符合中国的习俗,有些人看不懂,所以通过日期的格式化方法将其改为中国的时间显示方式;
  2. 同时也为了替代Date类中的已经过时了的方法;

层级关系:

java.lang.Object

  java.text.Format implements Serializable, Cloneable

    java.text.DateFormat

      java.text.SimpleDateFormat

SimpleDateFormat的两个重要功能:

  1. 格式转换(format):将日期转换为指定的格式(将Date对象转换为你想要的的显示方式)
    1. public String format(Date date)
    2. public String format(Object time)
  2. 时间解析(parse):将表示时间的字符串转为Date对象
    1. public Date parse(String date) throws ParseException

理解格式转换和时间解析:

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

public class TestDate {
	
	public static void main(String[] args) {
		Date date = new Date();
		System.out.println("时间格式转换前:" + date); //Mon Aug 31 10:31:05 CST 2020
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		System.out.println("时间格式转换后:" +sdf.format(date));
		/* 上述代码输出;
		时间格式转换前:Mon Aug 31 13:36:06 CST 2020
		时间格式转换后:2020年08月31日 13:36:06
		*/

		String time = "2058年08月31日 13:36:06";
		try {
			System.out.println("SimpleDateFormat解析:" + sdf.parse(time));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		//上述代码输出:SimpleDateFormat解析:Sat Aug 31 13:36:06 CST 2058
	}
}

实例:

问题:请问 “2019-11-04 09:30:30” 往后 1天15小时,30分29s后的时间是多少?

算法:

  1. 将该字符串时间使用SimpleDateFormat进行parse为Date对象。
  2. 在Date对象上进行时间的加法。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        String date = "2019-11-04 09:30:30";

        System.out.println(timeCalculation(date));
        System.out.println(timeCalculation(""));
        System.out.println(timeCalculation("2020 11 1 09:20:33"));
    }

    /**
     * 功能:请问 “2019-11-04 09:30:30” 往后 1天15小时,30分29s后的时间是多少?
     * 输入:时间串
     * 输出:计算后的时间串
     * 算法:
     *  1.将该字符串时间使用SimpleDateFormat进行parse为Date对象。
     *  2.在Date对象上进行时间的加法。
     */
    public static String timeCalculation(String dateTime) {
        //注意:参数必须与被解析的时间的格式完全一致,否则抛出ParseException
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parseDate = new Date();
        String result = "";

        try {
            parseDate = simpleDateFormat.parse(dateTime);
            long newDate = parseDate.getTime() + (24L *60*60 + 15*60*60 + 30*60 + 29) * 1000; //小心溢出,使用L
            result = simpleDateFormat.format(newDate);
        } catch (ParseException e) {
            //e.printStackTrace();
            result = "解析异常,请检查入参格式";
        }
        return result;
    }
}

 

Calendar类

特性:

  1. 所在包java.util.Calendar
  2. 该类的存在就是为了操作时间;
  3. Calendar类是一个抽象类,没有自身的实现类,但是可以通过自身提供的getInstance获取一个实例;

第一个Calendar实例

import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        //实例
        Calendar rightNow = Calendar.getInstance();

        //获取
        int year = rightNow.get(Calendar.YEAR);
        int days = rightNow.get(Calendar.DAY_OF_YEAR);
        Date date = rightNow.getTime(); //获取日期对象
        long time = rightNow.getTimeInMillis(); //此刻时间毫秒值

        //修改
        rightNow.set(Calendar.YEAR, 2022);

        //运算
        rightNow.add(Calendar.DAY_OF_YEAR , 701); //时间的加法操作
        rightNow.add(Calendar.HOUR , -15); //时间的减法操作
    }
}

总结:

  • 日期时间Date类:获取当前时间距离1970年1月1日0点的毫秒数
  • 数据格式化SimpleDateFormat类:将时间格式转换成自己想要的格式
  • 日历Calendar类:对时间进行操作(加减等运算)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值