• 周四. 10 月 3rd, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

工具类:日期处理转换

admin

11 月 28, 2021

     日常工作中,我们会经常用做日期的格式化、日期与字符串之间的转换、日期之间的计算等。为了聚焦项目本身而不要过分关注其他细枝末节,本人写了一个开发中可能会用到的日期工具类。这个工具类里主要包含有“将日期字符串转换为Date日期”、“将Date日期转换为字符串形式”、“获取日期区间段内的每日日期”、“两个日期的时间戳之差”等这几个方法。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class DateTimeUtils
{
    
    /**
     * 将日期字符串转换为日期对象
     * 
     * @param dateStr 日期字符串,如“2018-10-08”
     * @param dateFormate 日期格式化字符串,如“yyyy-MM-dd"
     * @return 日期对象
     * @see [类、类#方法、类#成员]
     * @Description: TODO
     */
    public static Date parseDate(String dateText, String dateFormate)
    {
        if(dateText==null|| dateText.trim().isEmpty())
            return null;
        
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormate);
        Date date = null;
        try
        {
            date = sdf.parse(dateText);
        }
        catch (ParseException e)
        {
          e.printStackTrace();
        }
        return date;
    }
    
    /**
     * 获得某日期区间的每日日期集合
     * 
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @return 日期集合
     * @see [类、类#方法、类#成员]
     */
    public static List<Date> getDatePeriodList(Date startDate, Date endDate)
    {
        List<Date> listDate = new ArrayList<Date>();
        // 将起始日期加入日期列表
        listDate.add(startDate);
        // 循环中会用到起止日期之间的日历对象
        Calendar calCurrentDate = Calendar.getInstance();
        // 将其初始值设置为起始日期
        calCurrentDate.setTime(startDate);
        while (endDate.after(calCurrentDate.getTime()))
        {
            // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中
            calCurrentDate.add(Calendar.DAY_OF_MONTH, 1);
            listDate.add(calCurrentDate.getTime());
        }
        return listDate;
    }
    
    /**
     * 获得某日期区间的字符串型每日日期集合
     * <br>
     * 如2018-10-01、2018-10-02、...2018-10-21
     * 
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @param dateFormat 日期格式化字符串,如“yyyy-MM-dd"
     * @return 字符串型日期集合
     * @see [类、类#方法、类#成员]
     * @Description: TODO
     */
    public static List<String> datePeriodText(Date startDate, Date endDate, String dateFormat)
    {
        
        List<String> dateStrs = new ArrayList<>();
        // 将起始日期加入日期列表
        String startDateStr = dateToTextFormat(startDate, dateFormat);
        dateStrs.add(startDateStr);
        // 循环中会用到起止日期之间的日历对象
        Calendar calCurrentDate = Calendar.getInstance();
        // 将其初始值设置为起始日期
        calCurrentDate.setTime(startDate);
        while (endDate.after(calCurrentDate.getTime()))
        {
            // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中
            calCurrentDate.add(Calendar.DAY_OF_MONTH, 1);
            String curDateStr = dateToTextFormat(calCurrentDate.getTime(), dateFormat);
            dateStrs.add(curDateStr);
        }
        return dateStrs;
        
    }
    
    /**
     * 将日期对象转换为字符串形式
     * 
     * @param date 日期
     * @param dateFormate  日期格式化字符串,如“yyyy-MM-dd"
     * @return 字符串格式的日期
     * @see [类、类#方法、类#成员]
     * @Description: TODO
     */
    public static String dateToTextFormat(Date date, String dateFormat)
    {
        
        return new SimpleDateFormat(dateFormat).format(date);
    }
    
    /**
     * 比较两个字符串格式的日期dateA 、dateB的先后时间顺序
     * <p>
     * 返回值为1表示dateA时间在dateB之后, 返回值为-1表示dateA时间在dateB之前, 返回值为0表示dateA、dateB时间相同,
     * 
     * @param dateA 日期1,如"08:10"
     * @param dateB 日期2,如"08:21"
     * @param dateFormate 日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制)
     * @return 有-1,0,1这三个返回值
     * @see [类、类#方法、类#成员]
     * @Description: TODO
     */
    public static int compareTo(String dateA, String dateB, String dateFormate)
    {
        Date date1 = parseDate(dateA, dateFormate);
        Date date2 = parseDate(dateB, dateFormate);
        // date1在date2之后
        if (date1.getTime() > date2.getTime())
        {
            return 1;
        }
        // date1 在date2之前
        else if (date1.getTime() < date2.getTime())
        {
            return -1;
        }
        // date1 、date2时间相同
        else
        {
            return 0;
        }
    }
    
    /** 
     * 计算两个字符串格式的日期dateA 、dateB的时间戳之差
     * 
     * @param dateA  日期A,如"08:10" 、"2018-03-10 12:12"
     * @param dateB  日期B,如"08:21"、 "2018-03-15 14:12"
     * @param dateFormate  日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制) 、 "yyyy-MM-dd HH:mm"
     * @return 两日期之差的毫秒数
     * @see [类、类#方法、类#成员]
     */
    public static long diff(String dateA,String dateB,String dateFormate){
        Date date1 = parseDate(dateA, dateFormate);
        Date date2 = parseDate(dateB, dateFormate);
      
        return date1.getTime()-date2.getTime();
    }
    
    /** 
     * 计算两个日期相差的小时数
     * @param newDate
     * @param oldDate
     * @return
     * @see [类、类#方法、类#成员]
     */
    public  static long calcTimeDiffOnHour(Date newDate ,Date oldDate){
        if(newDate==null || oldDate ==null){
            throw new IllegalArgumentException("参数 newDate 、oldDate不能为空");
        }
       
       long diffMillis= newDate.getTime()-oldDate.getTime();
       return diffMillis/(1000*60*60);
    }
    
    
    
    public static void main(String[] args)
    {
        long t=calcTimeDiffOnHour(new Date(),new Date(119,7,24));
        
        System.out.println(t);
        System.out.println(new Date(119,7,24)+"  "+new Date());
    }
}

  

发表回复