java 获取两个日期的时间差

trainBeginTime是从本地数据库获取的时间,格式为”yyyy-MM-ddTHH:mm:ss“。
主要逻辑:

 @SuppressLint("SimpleDateFormat")
 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 df.setTimeZone(TimeZone.getTimeZone("GMT+08"));// 这里一定要设置GMT时区
 String currentTime  = df.format(new Date());
 Date date1 = MyDateUtil.parseDate(trainBeginTime.replace("T"," "), "yyyy-MM-dd HH:mm:ss");
 Date date2 = MyDateUtil.parseDate(currentTime, "yyyy-MM-dd HH:mm:ss");
 // 获取相差的天数
 Calendar calendar = Calendar.getInstance();
 calendar.setTime(date1);
 long timeInMillis1 = calendar.getTimeInMillis();
 calendar.setTime(date2);
 long timeInMillis2 = calendar.getTimeInMillis();
 long betweenDays =  ((timeInMillis2 - timeInMillis1) / (1000L*3600L*24L))+1L;
  textView.setText("时间相差"+betweenDays+"天");

其中MyDateUtil.java:

import android.os.Build;
import androidx.annotation.RequiresApi;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;

/**
 * Description: 日期工具类
 */
public class MyDateUtil {
    /**
     * 将指定的日期字符串转换成日期
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return 日期对象
     */
    public static Date parseDate(String dateStr, String pattern)
    {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Date date;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
            throw  new RuntimeException("日期转化错误");
        }
        return date;
    }
    /**
     * 将指定的日期格式化成指定的日期字符串
     * @param date 日期对象
     * @param pattern 格式
     * @return 格式化后的日期字符串
     */
    public static String dateFormate(Date date, String pattern)
    {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String dateStr;
        if(date == null)
        {
            return "";
        }
        dateStr = sdf.format(date);
        return dateStr;
    }
    /**
     * 查询指定日期前后指定的天数
     * @param date 日期对象
     * @param days 天数
     * @return 日期对象
     */
    public static Date incr(Date date, int days)
    {
        if (date == null){
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, days);
        return calendar.getTime();
    }

    /**
     * 将LocalDate日期转化成Date
     * @param localDate LocalDate对象
     * @return Date对象
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static Date localDateToDate(LocalDate localDate)
    {
        if (localDate == null)
        {
            return null;
        }
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(zoneId);
        Date date = Date.from(zonedDateTime.toInstant());
        return date;
    }
    /**
     * 将Date转成LocalDate对象
     * @param date Date对象
     * @return LocalDate对象
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static LocalDate dateToLocalDate(Date date)
    {
        if (date == null)
        {
            return null;
        }
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = date.toInstant();
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        return localDate;
    }
}

这里还有一个问题,就是计算出的时间有时候会感觉少一天,这是因为上面代码是按时分秒计算的,当时间差不足24H时,日期就不会加1,因此,将"yyyy-MM-dd HH:mm:ss"修改成"yyyy-MM-dd"就可以了。

你可能感兴趣的:(java 获取两个日期的时间差)