对两个日期之间的操作

package com.iscc.servicesupport.analysis.util;

import java.text.DecimalFormat;
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 AccountDateUtil {
 private static transient int gregorianCutoverYear = 1582;

 /** 闰年中每月天数 */
 private static final int[] DAYS_P_MONTH_LY = { 31, 29, 31, 30, 31, 30, 31,
   31, 30, 31, 30, 31 };

 /** 非闰年中每月天数 */
 private static final int[] DAYS_P_MONTH_CY = { 31, 28, 31, 30, 31, 30, 31,
   31, 30, 31, 30, 31 };

 /** 代表数组里的年、月、日 */
 private static final int Y = 0, M = 1, D = 2, H = 3;

 /** 过滤掉17点到08点的数据 */
 private static final String[] DELETE_NO_NEED_HOUR = { "17", "18", "19",
   "20", "21", "22", "23", "24", "00", "01", "02", "03", "04", "05",
   "06", "07" };

 /**
  * 将代表日期的字符串分割为代表年月日的整形数组
  *
  * @param date
  * @return ymd
  */
 public static int[] splitYMD(String date) {
  date = date.replace("-", "");
  int[] ymd = { 0, 0, 0 };
  ymd[Y] = Integer.parseInt(date.substring(0, 4));
  ymd[M] = Integer.parseInt(date.substring(4, 6));
  ymd[D] = Integer.parseInt(date.substring(6, 8));
  return ymd;
 }

 /**
  * 将代表日期的字符串分割为代表年月日小时的整形数组
  *
  * @param date
  * @return ymdh
  */
 public static int[] splitYMDH(String date) {
  date = date.replace("-", "");
  date = date.replace(" ", "");
  date = date.replace(":", "");
  int[] ymdh = { 0, 0, 0, 0 };
  ymdh[Y] = Integer.parseInt(date.substring(0, 4));
  ymdh[M] = Integer.parseInt(date.substring(4, 6));
  ymdh[D] = Integer.parseInt(date.substring(6, 8));
  ymdh[H] = Integer.parseInt(date.substring(8, 10));
  return ymdh;
 }

 /**
  * 将代表日期的字符串分割为代表年月的整形数组
  *
  * @param date
  * @return ym
  */
 public static int[] splitYM(String date) {
  date = date.replace("-", "");
  int[] ym = { 0, 0 };
  ym[Y] = Integer.parseInt(date.substring(0, 4));
  ym[M] = Integer.parseInt(date.substring(4, 6));
  return ym;
 }

 /**
  * 检查传入的参数代表的年份是否为闰年
  *
  * @param year
  * @return boolean
  */
 public static boolean isLeapYear(int year) {
  return year >= gregorianCutoverYear ? ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
    : (year % 4 == 0);
 }

 /**
  * 日期加1天
  *
  * @param year
  * @param month
  * @param day
  * @return ymd
  */
 private static int[] addOneDay(int year, int month, int day) {
  if (isLeapYear(year)) {
   day++;
   if (day > DAYS_P_MONTH_LY[month - 1]) {
    month++;
    if (month > 12) {
     year++;
     month = 1;
    }
    day = 1;
   }
  } else {
   day++;
   if (day > DAYS_P_MONTH_CY[month - 1]) {
    month++;
    if (month > 12) {
     year++;
     month = 1;
    }
    day = 1;
   }
  }
  int[] ymd = { year, month, day };
  return ymd;
 }

 /**
  * 时间加1小时
  *
  * @param year
  * @param month
  * @param day
  * @param hour
  * @return ymdh
  */
 private static int[] addOneHour(int year, int month, int day, int hour) {
  if (isLeapYear(year)) {
   hour++;
   if (hour > 24) {
    day++;
    if (day > DAYS_P_MONTH_LY[month - 1]) {
     month++;
     if (month > 12) {
      year++;
      month = 1;
     }
     day = 1;
    }
    hour = 1;
   }
  } else {
   hour++;
   if (hour > 24) {
    day++;
    if (day > DAYS_P_MONTH_CY[month - 1]) {
     month++;
     if (month > 12) {
      year++;
      month = 1;
     }
     day = 1;
    }
    hour = 1;
   }
  }
  int[] ymdh = { year, month, day, hour };
  return ymdh;
 }

 /**
  * 月数加1月
  *
  * @param year
  * @param month
  * @return ym
  */
 private static int[] addOneMonth(int year, int month) {
  month++;
  if (month > 12) {
   year++;
   month = 1;
  }
  int[] ym = { year, month };
  return ym;
 }

 /**
  * 将不足两位的月份或日期补足为两位
  *
  * @param decimal
  * @return String
  */
 public static String formatMonthDayHour(int decimal) {
  DecimalFormat df = new DecimalFormat("00");
  return df.format(decimal);
 }

 /**
  * 将不足四位的年份补足为四位
  *
  * @param decimal
  * @return String
  */
 public static String formatYear(int decimal) {
  DecimalFormat df = new DecimalFormat("0000");
  return df.format(decimal);
 }

 /**
  * 计算两个日期之间相隔的天数
  *
  * @param begin
  * @param end
  * @return day
  */
 public static long countDay(String begin, String end) {
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  Date beginDate, endDate;
  long day = 0;

  try {
   beginDate = format.parse(begin);
   endDate = format.parse(end);
   day = (endDate.getTime() - beginDate.getTime())
     / (24 * 60 * 60 * 1000);
  } catch (ParseException e) {
   e.printStackTrace();
  }

  return day;
 }

 /**
  * 计算两个日期之间相隔的小时数
  *
  * @param begin
  * @param end
  * @return hour
  */
 public static long countDayAndHour(String begin, String end) {
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Date beginDate, endDate;
  long hour = 0;

  try {
   beginDate = format.parse(begin);
   endDate = format.parse(end);
   hour = (endDate.getTime() - beginDate.getTime()) / (60 * 60 * 1000);
  } catch (ParseException e) {
   e.printStackTrace();
  }

  return hour;
 }

 /**
  * 计算两个日期之间相隔的月数
  *
  * @param begin
  * @param end
  * @return iMonth
  */
 public static long countMonth(String begin, String end) {
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  long iMonth = 0;
  int flag = 0;
  try {
   Calendar objCalendarDate1 = Calendar.getInstance();
   objCalendarDate1.setTime(format.parse(begin));

   Calendar objCalendarDate2 = Calendar.getInstance();
   objCalendarDate2.setTime(format.parse(end));

   if (objCalendarDate2.equals(objCalendarDate1))
    return 0;
   if (objCalendarDate1.after(objCalendarDate2)) {
    Calendar temp = objCalendarDate1;
    objCalendarDate1 = objCalendarDate2;
    objCalendarDate2 = temp;
   }
   if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1
     .get(Calendar.DAY_OF_MONTH))
    flag = 1;

   if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1
     .get(Calendar.YEAR))
    iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1
      .get(Calendar.YEAR))
      * 12
      + objCalendarDate2.get(Calendar.MONTH) - flag)
      - objCalendarDate1.get(Calendar.MONTH);
   else
    iMonth = objCalendarDate2.get(Calendar.MONTH)
      - objCalendarDate1.get(Calendar.MONTH) - flag;

  } catch (Exception e) {
   e.printStackTrace();
  }
  return iMonth;

 }

 /**
  * 以循环的方式计算日期
  *
  * @param beginDate
  * @param endDate
  * @return everyDays
  */
 public static List<String> getEveryday(String beginDate, String endDate) {
  long days = countDay(beginDate, endDate);
  int[] ymd = splitYMD(beginDate);
  List<String> everyDays = new ArrayList<String>();
  everyDays.add(beginDate.split(" ")[0]);
  if (days != 1) {
   for (int i = 0; i < days; i++) {
    ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
    everyDays.add(formatYear(ymd[Y]) + "-"
      + formatMonthDayHour(ymd[M]) + "-"
      + formatMonthDayHour(ymd[D]));
   }
  }
  return everyDays;
 }

 /**
  * 以循环的方式计算小时
  *
  * @param beginDate
  * @param endDate
  * @return everyHours
  */
 public static List<String> getEverydayAndEveryhour(String beginDate,
   String endDate) {
  long dayHours = countDayAndHour(beginDate, endDate);
  int[] ymdh = splitYMDH(beginDate);
  List<String> everyHours = new ArrayList<String>();
  everyHours.add(beginDate.split(" ")[0] + " "
    + beginDate.split(" ")[1].split(":")[0]);
  if (dayHours != 1) {
   for (int i = 0; i < dayHours; i++) {
    ymdh = addOneHour(ymdh[Y], ymdh[M], ymdh[D], ymdh[H]);
    everyHours.add(formatYear(ymdh[Y]) + "-"
      + formatMonthDayHour(ymdh[M]) + "-"
      + formatMonthDayHour(ymdh[D]) + " "
      + formatMonthDayHour(ymdh[H]));
   }
  }
  return everyHours;
 }

 /**
  * 以循环的方式计算月
  *
  * @param beginDate
  * @param endDate
  * @return everyMonths
  */
 public static List<String> getEveryMonth(String beginDate, String endDate) {
  long months = countMonth(beginDate, endDate);
  int[] ym = splitYM(beginDate);
  List<String> everyMonths = new ArrayList<String>();
  everyMonths.add(beginDate.split(" ")[0].split("-")[0] + "-"
    + beginDate.split(" ")[0].split("-")[1]);
  if (months != 1) {
   for (int i = 0; i < months; i++) {
    ym = addOneMonth(ym[Y], ym[M]);
    everyMonths.add(formatYear(ym[Y]) + "-"
      + formatMonthDayHour(ym[M]));
   }
  }
  return everyMonths;
 }

 /**
  * 过滤掉不需要的时间
  *
  * @param dateList
  * @return dateList
  */
 public static List<String> deleteNoNeedHour(List<String> dateList) {
  List<String> temp = new ArrayList<String>();
  for (String date : dateList) {
   for (int i = 0; i < DELETE_NO_NEED_HOUR.length; i++) {
    if (date.split(" ")[1].equals(DELETE_NO_NEED_HOUR[i])) {
     temp.add(date);
    }
   }
  }
  dateList.removeAll(temp);
  return dateList;
 }

 /**
  * 按天转换日期格式
  *
  * @param beginDate
  * @param endDate
  * @return times
  */
 public static String[] modifyDateByDay(String beginTime, String endTime) {
  String[] times = { "", "" };
  String[] beginTimeTemp = beginTime.split(" ");
  String[] endTimeTemp = endTime.split(" ");
  times[0] = beginTimeTemp[0] + " 08:00:00";
  times[1] = endTimeTemp[0] + " 17:00:00";
  return times;
 }

 /**
  * 按月转换日期格式
  *
  * @param beginDate
  * @param endDate
  * @return times
  */
 public static String[] modifyDateByMonth(String beginTime, String endTime) {
  String[] times = { "", "" };
  int[] beginTimeTemp = splitYMD(beginTime);
  int[] endTimeTemp = splitYMD(endTime);
  times[0] = formatYear(beginTimeTemp[Y]) + "-"
    + formatMonthDayHour(beginTimeTemp[M]) + "-" + "-01"
    + " 08:00:00";
  if (isLeapYear(beginTimeTemp[0])) {
   times[1] = formatYear(beginTimeTemp[Y]) + "-"
     + formatMonthDayHour(beginTimeTemp[M]) + "-"
     + formatMonthDayHour(DAYS_P_MONTH_LY[beginTimeTemp[M] - 1])
     + " 17:00:00";
  } else {
   times[1] = formatYear(beginTimeTemp[Y]) + "-"
     + formatMonthDayHour(beginTimeTemp[M]) + "-"
     + formatMonthDayHour(DAYS_P_MONTH_CY[beginTimeTemp[M] - 1])
     + " 17:00:00";
  }

  return times;
 }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值