Java 计算时间差

1. Date 计算时间差

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

public class DateFormatDemo {
    public static void main(String[] args) {
        //设置时间格式,为了 能转换成 字符串
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //当前时间
        Date beginTime = new Date();
        //利用时间格式,把当前时间转为字符串
        String start = df.format(beginTime);
        //当前时间 转为 长整型 Long
        Long begin = beginTime.getTime();
        System.out.println("任务开始,开始时间为:"+ start);
        int num;
        //循环睡眠 5次,每次 1秒
        for(int i = 0; i < 5 ; i++){
            num = i +1;
            try {
                //调阻塞(睡眠)方法,这里睡眠 1 秒
                Thread.sleep(1000);
                System.out.println(num+"秒");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //获取结束时间
        Date finishTime = new Date();
        //结束时间 转为 Long 类型
        Long end = finishTime.getTime();
        // 时间差 = 结束时间 - 开始时间,这样得到的差值是毫秒级别
        long timeLag = end - begin;
        //天
        long day=timeLag/(24*60*60*1000);
        //小时
        long hour=(timeLag/(60*60*1000)-day*24);
        //分钟
        long minute=((timeLag/(60*1000))-day*24*60-hour*60);
        //秒,顺便说一下,1秒 = 1000毫秒
        long s=(timeLag/1000-day*24*60*60-hour*60*60-minute*60);
        System.out.println("用了 "+day+"天 "+hour+"时 "+minute+"分 "+s+"秒");
        System.out.println("任务结束,结束时间为:"+ df.format(finishTime));
    }

}

2. 两 LocalDate 计算时间差

2.1 按 整数年 计算 LocalDate
/**
* 传过来的LocalDate类型的日期,距当前时间,相差多少年
* 可计算年龄,工龄等
* 返回Integer类型的数
*/
public static Integer getYear(LocalDate date){
     //传过来的日期
     DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy");
     String dateStr = df.format(date);
     Long yearLong = Long.parseLong(dateStr);

     //当前日期
     LocalDate yearNow = LocalDate.now();
     String yearNowStr = df.format(yearNow);
     Long yearNowLong = Long.parseLong(yearNowStr);

     //当前 - 传过来的参数
     long age = yearNowLong - yearLong;
     Integer year = Math.toIntExact(age);
     return year;
}
2.2 按 年月日 yyyy-MM-dd 判断 俩 LocalDate 大小
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @author 孙永潮
 */
public class DateTimeDemo {
    public static void main(String[] args) {
        DateTimeFormatter daf = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        LocalDate firstDate = LocalDate.of(2023, 3, 22);
        System.out.println( "firstDate = " + firstDate );

        LocalDate secondDate = LocalDate.now();
        System.out.println("secondDate = "  + secondDate);


        boolean before = firstDate.isBefore(secondDate);
        System.out.println("判断 firstDate < secondDate 结果为 " +before);

        boolean after = firstDate.isAfter(secondDate);
        System.out.println("判断 firstDate > secondDate 结果为 " + after);

        boolean equal = firstDate.isEqual(secondDate);
        System.out.println("判断 两日期相等 结果为 " + equal);
    }
}

3. LocalDateTime 计算时间差

import lombok.extern.slf4j.Slf4j;
import java.time.Duration;
import java.time.LocalDateTime;

/**
 * @author 孙永潮
 * @date 2022/8/25
 */
@Slf4j
public class LocalDateTimeDemo {
    public static void main(String[] args) {
        //开始时间
        LocalDateTime startTime = LocalDateTime.now();
        
        int num;
        //循环睡眠 3次,每次 1秒
        for(int i = 0; i < 3 ; i++){
            num = i +1;
            try {
                //调阻塞(睡眠)方法,这里睡眠 1 秒
                Thread.sleep(1000);
                System.out.println(num+"秒");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //结束时间
        LocalDateTime endTime  = LocalDateTime.now();
        
        // 获得两个时间之间的相差值
        Duration dur= Duration.between(startTime, endTime );

        //两个时间差的分钟数
        long minute = dur.toMinutes();

        //纳秒
        dur.toNanos();
        //毫秒
        long millisecond = dur.toMillis();
        //秒  ( 1秒 = 1000毫秒 )
        long s = dur.toMillis()/1000;
        //分钟
        dur.toMinutes();
        //小时
        dur.toHours();
        //天数
        dur.toDays();
        log.info("用了 {}分", minute);
        log.info("用了 {}秒", s);
        log.info("用了 {}毫秒", millisecond);
    }
}

使用Math.abs让差值永远为正数

import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author 孙永潮
 * @date 2022/8/26
 */
@Slf4j
public class LocalDateTimeDemo {
    public static void main(String[] args) {
        //开始时间
        LocalDateTime startTime = LocalDateTime.now();

        int s;
        //循环睡眠 3次,每次 1秒
        for(int i = 0; i < 3 ; i++){
            s = i + 1;
            try {
                //调阻塞(睡眠)方法,这里睡眠 1 秒
                Thread.sleep(1000);
                System.out.println(s + "秒");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //LocalDateTime endTime = LocalDateTime.of(2022, 8, 26, 9, 13, 38);
        //结束时间
        LocalDateTime endTime = LocalDateTime.now();

        //时间格式转换对象
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        String startStr = startTime.format(dtf);
        System.out.println("开始时间 = "+startStr);

        String endStr = endTime.format(dtf);
        System.out.println("结束时间 = " + endStr);

        //获取开始秒数
        long startSecond = startTime.toEpochSecond(ZoneOffset.ofHours(0));
        System.out.println("开始的秒数 = " + startSecond);

        //获取结束秒数
        long endSecond = endTime.toEpochSecond(ZoneOffset.ofHours(0));
        System.out.println("结束的秒数 = " + endSecond);

        //Math.abs()方法,两个long类型的数相减,得到的永远是正数
        long abs = Math.abs(endSecond - startSecond);

        //计算两个时间差的秒数,Java8的API暂时不支持,到Java9开始引入 duration.toSeconds() 支持
        //获取秒数
        long second = abs % 60;
        //获取分钟数
        long minute = abs / 60 % 60;
        //获取小时数
        long hour = abs / 60 / 60 % 24;
        //获取天数
        long day = abs / 60 / 60 / 24;

        System.out.println(day + "天" + hour + "时" + minute + "分" + second + "秒");
    }

}

4. Calendar 获取 当前时间

import cn.hutool.core.date.DateTime;
import cn.hutool.core.text.CharSequenceUtil;
import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;

/**
 * @author 孙永潮
 * @date 2023/1/5
 */
@Slf4j
public class StringDemo2 {
    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();

        // 获取当前年
        int year = calendar.get(Calendar.YEAR);
        System.out.println(year + "年");

        // 获取当前月
        int month = calendar.get(Calendar.MONTH) + 1;
        System.out.println(year + "年"+ month + "月");

        // 获取当前日
        int day = calendar.get(Calendar.DATE);
        System.out.println(year + "年"+ month + "月"+ day + "日");

        // 获取当前小时
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        System.out.println(year + "年"+ month + "月"+ day + "日 "+hour+"点");

        // 获取当前分钟
        int minute = calendar.get(Calendar.MINUTE);
        System.out.println(year + "年"+ month + "月"+ day + "日 "+hour+"点"+minute+"分");

        // 获取当前秒
        int second = calendar.get(Calendar.SECOND);
        System.out.println(year + "年"+ month + "月"+ day + "日 "+hour+"点"+minute+"分"+second+"秒");

        // 获取当前是本周第几天
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        //星期几
        String week = dateToWeek(null);

        System.out.println("按周日为每周的第1天,则现在是本周第" + dayOfWeek + "天 "+week);

        // 获取当前是本月第几天
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("当前为本 月 第" + dayOfMonth + "天");

        // 获取当前是本年第几天
        int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println("当前为本 年 第" + dayOfYear + "天");

    }

	//获取星期几
    public static String dateToWeek(String datetime) {
    	
    	//若参数 为空 或 为空字符串,就把参数 设置为当前时间
        if (CharSequenceUtil.isBlank(datetime) || Objects.equals(CharSequenceUtil.EMPTY,datetime)){
            datetime = DateTime.now().toString();
        }

		//时间日期转换对象
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");

		//星期几的 字符串数组
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};

		//获得一个日历,供计算使用
        Calendar cal = Calendar.getInstance();
        
        Date datet = null;
        try {
            datet = f.parse(datetime);
            cal.setTime(datet);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        
        //指示一个星期中的某天。
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0){
        	w = 0;
        }
            
        return weekDays[w];
    }

}

5. LocalDateTime 获取 当前时间

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.date.Week;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;

/**
 * @author 孙永潮
 */
public class DateTimeDemo {
    public static void main(String[] args) {

        //精确到秒的 时间格式
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //精确到毫秒的 时间格式
        DateTimeFormatter df_S = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

        //当前时间
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime精确到秒 = " + df.format(localDateTime));
        System.out.println("localDateTime精确到毫秒 = " + df_S.format(localDateTime));

        //年
        int yearly = localDateTime.getYear();

        //月
        int monthly = localDateTime.getMonthValue();

        //日
        int day = localDateTime.getDayOfMonth();

        //直接获取 英文版的星期几
        DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();

        //localDateTime 转换为 LocalDate
        LocalDate localDate = localDateTime.toLocalDate();

        int lengthOfYear = localDate.lengthOfYear();
        System.out.println("本年一共有 " + lengthOfYear + "天");

        int lengthOfMonth = localDate.lengthOfMonth();
        System.out.println("本月一共有 " + lengthOfMonth + "天");

        //获取LocalDate对应的星期值
        Week week = LocalDateTimeUtil.dayOfWeek(localDate);

        //转换为星期的中文名
        String weekToChinese = week.toChinese();

        //小时
        int hour = localDateTime.getHour();

        //分钟
        int minute = localDateTime.getMinute();

        //秒
        int second = localDateTime.getSecond();

        //毫秒
        long milliseconds = localDateTime.get(ChronoField.MILLI_OF_SECOND);
        System.out.println(milliseconds);

        //微妙
        long microseconds = localDateTime.get(ChronoField.MICRO_OF_SECOND);
        System.out.println(microseconds);

        //纳秒
        int nano = localDateTime.getNano();
        System.out.println(nano);

        //localDateTime 是线程安全的,个人认为 localDateTime只能精确到毫秒
        System.out.println(yearly + "年 " +  monthly+ "月 " + day+ "号 "
                + dayOfWeek + "(" + weekToChinese+ ")"
                + hour + "时 " + minute+ "分 " + second + "秒 "
                + milliseconds + "毫秒 " + microseconds + "微秒 " + nano + "纳秒");
    }
}

Calendar 和 LocalDateTime 区别

Calendar和LocalDateTime都是用于表示日期和时间的类,但它们有一些区别:

  1. API设计:Calendar是Java早期的日期和时间API,而LocalDateTime是Java 8引入的新日期和时间API。Calendar的设计存在一些问题,例如月份从0开始计数、线程不安全等。相比之下,LocalDateTime采用了更简洁、更直观的API设计,并且是线程安全的。

  2. 可变性:Calendar是可变的,可以通过修改其字段来改变日期和时间。而LocalDateTime是不可变的,一旦创建就不能被修改。这种不可变性使得LocalDateTime更适合多线程环境,并且可以避免副作用。

  3. 时区处理:Calendar可以处理时区,它提供了TimeZone类用于表示时区信息。而LocalDateTime不包含时区信息,它只表示本地日期和时间。如果需要处理时区,可以使用ZonedDateTime类。

  4. 功能和扩展性:Calendar提供了丰富的功能,例如日期计算、日期格式化等。而LocalDateTime的功能相对较少,它主要用于表示和操作日期和时间。不过,LocalDateTime可以与其他日期和时间类(如LocalDate、LocalTime)组合使用,以实现更复杂的操作。

综上所述,Calendar是旧的日期和时间API,具有一些设计上的问题,而LocalDateTime是Java 8引入的新日期和时间API,具有更好的设计和性能。如果使用Java 8或更新的版本,建议使用LocalDateTime来处理日期和时间。

  • 16
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值