Java中的时间日期类

前言

    之前在使用时间的时候,会用 System.currentMiliis() 这个函数,这个函数返回的是从1970年1月1日00:00开始至今所经历的毫秒数 long类型,拿到这个毫秒数 就可以进行换算年、月、日、星期。但是有专门计算时间和日期的类:
java.util.Date
    - java.sql.Date
    - java.sql.Time
    - java.sql.Timestamp
java.text.DateFormat
java.text.SimpleDateFormat
java.util.Calendar

一、时间和日期的类

1. 关于java.util.Date(方法大多数已过时)

    java.util.Date 是 java.sql.Date 和 java.sql.Time 和 java.sql.Timestamp 的父类,也是Java中的时间标准库,表示的是一个特定的瞬间从1970年1月1日00:00开始至今所经历的毫秒数,内部进行计算来获取具体的时间参数年、月、日、时 、分、秒;但是从JDK1.1(JDK8-JDK1.8)开始,推荐使用Calendar这个类来表示时间。
在这里插入图片描述

2. 关于java.text.DataFormat

    java.text.DataFormat 是一个抽象类,表示的是时间/日期格式化类,也可以进行时间的提取和时间的转换时间字符串解析出具体的时间,具体的时间转换成字符串表现形式。

    DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。

    DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。

    DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。

3. 关于java.text.SimpleDateFormat

    java.text.SimpleDateFormat 是 DataFormat 的实现子类,功能和DataFormat一样,但是会有更加丰富的操作。

对于格式化参数:

  • y 年 yyyy年-2021年

  • M 月 MM月-11月

  • d 日 dd日-06日 MM yyyy dd E a - 08 2021 16 monday AM

  • E 星期 E-星期日

  • a 上下午 a-PM/AM

  • H 小时(24小时制)

  • h 小时(12小时制) HH:mm:ss - 11:13:58

  • m 分钟

  • s 秒

4. 关于java.util.Calendar抽象类

    用于封装日历信息(包含时间),其主要作用在于其方法可以对时间分量进行运算(基于当前时间的偏移)。

二、关于时间的操作主要分为如下几个大类

1. 时间日期获取

    可以从Date类里面直接获取,或者从SimpleDateFormat里面规定格式进行格式化毫秒或者date都可以获取。

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

public class TimeDemo01 {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);//默认规定的
        //过时 千年时间虫 不推荐使用
        System.out.println(date.getHours());
        System.out.println(date.getYear());
        System.out.println(date.getDay());
        System.out.println(date.getMonth());
        System.out.println("==============");
        //自己重新指定写一个  格式化类
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = df.format(System.currentTimeMillis());//毫秒值按照规定的格式转
        String time2 = df.format(date);//date对象
        System.out.println(time);
        System.out.println(time2);
    }
}

2. 日期转换

(1)日期转字符串、字符串转日期

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

public class TimeDemo02 {
    public static void main(String[] args) throws ParseException {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //日期转字符串
        Calendar calendar = Calendar.getInstance();//获取当前时间
        Date date = calendar.getTime();//通过Calendar类获取的,获取当前的时间对象
        // Date getTime() 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
        String s1 = sdf.format(date);//格式化 String format(Date date)将一个 Date 格式化为日期/时间字符串。
        System.out.println(s1);

        //字符串解析日期
        String s2 = "2021-8-24 22:19:35";
        Date date2 = sdf.parse(s2);
        // Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期。
        System.out.println(date2);
    }
}

(2)字符串转时间,用Calendar来获取详细的内容。

public final static int ERA = 0;
public final static int YEAR = 1;
public final static int MONTH = 2;
public final static int WEEK_OF_YEAR = 3;
public final static int WEEK_OF_MONTH = 4;
public final static int DATE = 5;
public final static int DAY_OF_MONTH = 5;
public final static int DAY_OF_YEAR = 6;
public final static int DAY_OF_WEEK = 7;
public final static int DAY_OF_WEEK_IN_MONTH = 8;
public final static int AM_PM = 9;


后面还有很多用常量来表示,便于我们来获取所要的;

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

public class TimeDemo03 {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");//多态 本质是SimpleDateFormat子类
        Date date = df.parse("2021年8月16日 14时16分52秒");//解析
        Calendar cal = df.getCalendar();//解析之后获得一个日历对象
        System.out.println(cal.getTime());//把日历对象打印出来
        //getTime()底层返回的是 return new Date(getTimeInMillis()); Date类型
        //获取当前日历时间 Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);  //获取年
        int month = cal.get(Calendar.MONDAY); //获取月
        int day = cal.get(Calendar.DATE);   //获取日
        int hour = cal.get(Calendar.HOUR);  //获取时
        int minute = cal.get(Calendar.MINUTE);//获取分
        int second = cal.get(Calendar.SECOND); //获取秒
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);//一周中的第几天
        int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);//一年中的第几天
        System.out.println(year + " " + month + " " + day);//month从0(一月)算的
        System.out.println(hour + " " + minute + " " + second);
        System.out.println(dayOfWeek);
        System.out.println(dayOfYear);
    }
}

(3)获取当前时间,显示 :下午、下午

import java.text.DateFormat;
import java.util.Date;

public class TimeDemo04 {
    public static void main(String[] args) {
        Date date = new Date();
        //有Date就要日期,Time就是时间
        //年 月 日 ----- 2021-8-24
        DateFormat df1 = DateFormat.getDateInstance();
        System.out.println(df1.format(date));

        //年 月 日 时 分 秒 ----- 2021-8-24 22:41:27
        DateFormat df2 = DateFormat.getDateTimeInstance();
        System.out.println(df2.format(date));

        //时 分 秒 ----- 22:41:27
        DateFormat df3 = DateFormat.getTimeInstance();
        System.out.println(df3.format(date));

        //2021年8月24日 星期二 下午10时41分27秒 GMT+08:00    DateFormat.FULL全显示
        DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
        System.out.println(df4.format(date));

        //2021年8月24日 下午10时41分27秒   DateFormat.LONG
        DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
        System.out.println(df5.format(date));

        //21-8-24 下午10:41      DateFormat.SHORT
        DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);
        System.out.println(df6.format(date));

        //2021-8-24 22:41:27     DateFormat.MEDIUM
        DateFormat df7 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);
        System.out.println(df7.format(date));
    }
}

3. 日期加减

以某一个日期为基准 计算几天前/后…
(1)获取当前时间的前一年时间,add() 方法;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TimeDemo05 {
    public static void main(String[] args) {
        Calendar now  = Calendar.getInstance();
        print(now);
        now.add(Calendar.YEAR,1);   //是现在时间的1年后
        print(now);
        now.add(Calendar.YEAR,-1);  //是现在时间的1年前
        print(now);
        now.add(Calendar.HOUR,-1);
        print(now);

        Calendar specialDate = Calendar.getInstance();
        specialDate.setTimeInMillis(System.currentTimeMillis() / 2);
        print(specialDate);
        specialDate.add(Calendar.YEAR,-1000);
        print(specialDate);
    }
    //重写一个打印格式
    private static void print(Calendar cal) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(cal.getTime()));
    }
}

结果:
在这里插入图片描述
(2)根据时间然后对小时、分钟、秒进行相加;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TimeDemo06 {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE , -30);//30分钟前
        String s = df.format(nowTime.getTime());
        System.out.println(s);
    }
}

结果:
在这里插入图片描述
在这里插入图片描述
(3)计算2017年1月1日距离现在多少天;

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

public class TimeDemo07 {
    public static void main(String[] args) throws ParseException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2017-01-01 14:52:30";
        Calendar calendar = Calendar.getInstance();
        long nowDate = calendar.getTime().getTime();    //获取当前时间的毫秒值
        long specialDate = sdf.parse(dateString).getTime(); //获取指定日期的毫秒值
        long betweenDate = (nowDate - specialDate) / (1000 * 60 * 60 * 24);//计算间隔多少天
        System.out.println(betweenDate);
    }
}

结果:
在这里插入图片描述

(4)求两个日期 相差多少小时、分钟、秒;

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

public class TimeDemo08 {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = df.parse("2021-08-16 15:18:23");
        Date d2 = df.parse("2021-08-17 17:45:32");
        long nd = 1000 * 24 * 60 * 60;  //一天多少毫秒
        long nh = 1000 * 60 * 60;   //一小时多少毫秒
        long nm = 1000 * 60;    //一分钟多少毫秒
        long ns = 1000; //一秒多少毫秒

        long diff = d2.getTime() - d1.getTime();
        //计算差多少天
        long day = diff / nd;
        //计算差多少小时
        long hour = diff % nd / nh;
        //计算差多少分钟
        long minute = diff % nd % nh / nm;
        //计算差多少秒
        long second = diff % nd % nh % nm / ns;
        System.out.println(day + " " + hour + " " + minute + " " + second);
    }
}

结果:
在这里插入图片描述

4. 日期比较

一种是通过before和after比较,或者compareTo来比较。

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

public class TimeDemo09 {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString1 = "2021-08-16 11:11:11";
        String dateString2 = "2021-08-17 11:11:11";
        Date date1 = sdf.parse(dateString1);
        Date date2 = sdf.parse(dateString2);

        System.out.println(date1.before(date2));
        System.out.println(date1.after(date2));
        System.out.println(date1.compareTo(date2));
    }
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值