Java日期类汇总

日期

//Java提供的日期类
import java.util.Date;
//值得注意的一个是Java另外还提供了一个接收SQLDate的类型:
import java.sql.Date// --> 后续再说

1970年1月1日0点

浅谈一下计算机时间为什么始于1970年1月1日0时?

System.out.println(Integer.MAX_VALUE);

​ Integer的范围内最大值–>2147483647 也就是2的31次方-1
Integer在Java中是int的包装类型,4字节也就是32位,所以2147483647也是Integer能表示的最大范围, 一年的总秒数是31,536,000那么计算机最多也就表示到2147483647秒,大概是68.1年
​ 而1970年经过68.1年达到–>2038年01月19日03时14分07秒达到该极限时便会出现时间回归现象,很多软件就会运行异常,但是由于计算机的发展逐渐产生了64位、甚至是128位的计算机
​ 我们以64位为例,64位仍旧以1970年为基准经过换算它能够表示的最大时间是292,277,026,596年12月4日15时30分08秒
大概两亿年后:计算机还存不存在我不知道,反正我是不存在了

包括Java在内的绝大多数编程语言均起源于UNIX系统,而作为最早出现的操作系统考虑到计算机产生的年代和应用的年限(1968年产生),所以综合采用了1970年为基准点 作为UNIX系统的纪元时间,Java自然也遵循了这一约束

第一代操作Date

/* 获取当前系统时间 */
        System.out.println(new Date());
        /* 返回距离1970.01.01.0时的毫秒值 */
        System.out.println(new Date().getTime());
        /* 将毫秒值换算成日期对象 获取的仍然是当前系统时间 */
        System.out.println(new Date(new Date().getTime()));
        /* 上述方式获取的时间打印格式为: Wed Nov 02 15:50:34 CST 2022 */
        /* 此时就需要利用simpleDateFormat来规定和解析日期格式 */
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String format = sdf.format(new Date());
        System.out.println(format);
        /* 同样我们可以只规定年月日 */
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf2.format(new Date()));
        /* 获取时分秒 */
        SimpleDateFormat sdf3 = new SimpleDateFormat("hh:mm:ss");
        System.out.println(sdf3.format(new Date()));

第二代操作Calendar日历

 /* Calendar日历类 */
        // Calendar通常不能定义打印的格式  需要开发人员自行组合显示
        // public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
        // 由于Calendar是抽象类,并且构造器均为protected修饰,所以不能通过new来直接创建示例  要通过API Calendar.getInstance
        Calendar cal = Calendar.getInstance();
        System.out.println("cal:"+ cal);
        System.out.println("通过Calendar获取时区:"+ cal.getTimeZone());
        /* 下面用Calendar获取具体字段 */
        //获取年  --> 2022年
        System.out.println("YEAR= \t"+cal.get(Calendar.YEAR));
        //获取月  --> 11月  获取月时返回的是从0开始编号  也就是 1月显示为0月  所以需要+1
        System.out.println("MONTH= \t"+(cal.get(Calendar.MONTH)+1));
        //获取日  --> 2日
        System.out.println("DAY_OF_MONTH= \t"+cal.get(Calendar.DAY_OF_MONTH));
        //获取时  --> 16时  两种形式 HOUR(12小时制) 和 HOUR_OF_DAY(24小时制)
        System.out.println("HOUR= \t"+cal.get(Calendar.HOUR_OF_DAY));
        //获取分  -->
        System.out.println("MINUTE= \t"+cal.get(Calendar.MINUTE));
        //获取秒
        System.out.println("SECOND= \t"+cal.get(Calendar.SECOND));
        // 开发人员自行组合打印日期时间
        System.out.println((cal.get(Calendar.YEAR)+"年"+(cal.get(Calendar.MONTH)+1))+"月"+cal.get(Calendar.DAY_OF_MONTH)+"日 "+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND));
        // 其他的杂七杂八
        //获取具体天DAY_OF_YEAR -->(顾名思义一年当中的第几天)
        System.out.println("DAY_OF_YEAR= \t"+cal.get(Calendar.DAY_OF_YEAR));

第三代LocalDate、LocalTime、LocalDateTime

  • LocalDate用于获取日期
  • LocalTIme表示获取时间
  • LocalDateTime获取日期+时间
  • 上述三种日期类构造器均为私有,不能直接通过new关键字获取实例,具体用法如下:
/* Java.time第三代日期类使用 */
        LocalDate date = LocalDate.now();
        System.out.println("获取日期:"+ date);
        LocalTime time = LocalTime.now();
        System.out.println("获取时间:"+ time);
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("获取日期+时间:"+ dateTime);
        /* 其他用法 */
        // -- 获取年
        int year = date.getYear();
        System.out.println("年:"+year);
        // -- 获取月  两种方式  方式一: 此处得到的是一个日期枚举值(英文月份名称)
        Month month = date.getMonth();
        System.out.println("(方式一)月:"+month);
        // 获取月份 方式二: 返回为数值
        int month2 = date.getMonthValue();
        System.out.println("(方式二)月:"+month2);
        // -- 获取日
        int days = date.getDayOfMonth();
        System.out.println("日:"+days);
        // -- 获取时
        int hours = time.getHour();
        System.out.println("时:"+hours);
        // -- 获取分
        int minute = time.getMinute();
        System.out.println("分:"+minute);
        // -- 获取秒
        int second = time.getSecond();
        System.out.println("秒:"+second);
        // 上述分别获取时分秒 是扽别利用了LocalDate和LocalTime  直接用LocalDateTime来获取
        System.out.println(dateTime.getYear()+"年"+dateTime.getMonthValue()+"月"+dateTime.getDayOfMonth()+"日   "+dateTime.getHour()+":"+dateTime.getMinute()+":"+dateTime.getSecond());

那么同样的也会有为第三代日期类做出格式规定和解析的方法类–DateTimeFormat

类似于SimpleDateFormat,用法如下:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime ldt = LocalDateTime.now();
        String format = dtf.format(ldt);
        System.out.println(format);

可以看出第三代的LocalDateTime与DateTimeFormat的用法与初代日期类的Date和SimpleDateFormat是相同的

持续日期/时间:Period和Duration

Period:用于计算两个日期的间隔

LocalDate ld1 = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2021,10,7);
        Period pi = Period.between(ld2,ld1);
        System.out.println(pi);
        // pi打印结果为--> P1Y1M1D  代表:Period 1 year 1 Month 1 Day
        int years = pi.getYears();
        System.out.println(years);
        int months = pi.getMonths();
        System.out.println(months);
        int days = pi.getDays();
        System.out.println(days);
        long all = pi.toTotalMonths();
        System.out.println("总月份:"+all);

Duration:用于计算两个时间点的间隔

/* Duration计算时间间隔用法 */
        LocalDateTime ldt1 = LocalDateTime.now();
        LocalDateTime ldt2 = LocalDateTime.of(2022,11,2,12,0);
        Duration between = Duration.between(ldt2,ldt1);
        System.out.println(between);
        //between打印结果 --> PT6H54M39.48S  代表 6 Hours 54 Minutes 39.48 Scond
        //相差总天数
        System.out.println("相差总天数"+between.toDays());
        //相差总小时数
        System.out.println("相差总小时数"+between.toHours());
        //相差总分钟数
        System.out.println("相差总分钟数"+between.toMinutes());
        //相差总秒数
        System.out.println("相差总秒数"+between.getSeconds());
        //相差总毫秒数
        System.out.println("相差总毫秒数"+between.toMillis());
        //相差总纳秒数
        System.out.println("相差总纳秒数"+between.toNanos());
        //相差不足一纳秒的纳秒数
        System.out.println("相差不足一纳秒的纳秒数"+between.getNano());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿仔牛奶_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值