遍历两个日期之间的所有日期

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

public class CountDate { 

   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; 
    
   /** 
   * 将代表日期的字符串分割为代表年月日的整形数组 
   * @param date 
   * @return 
   */ 
   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 year 
   * @return 
   */ 
   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 
   */ 
   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; 
   } 
    
   /** 
   * 将不足两位的月份或日期补足为两位 
   * @param decimal 
   * @return 
   */ 
   public static String formatMonthDay(int decimal){ 
       DecimalFormat df = new DecimalFormat("00"); 
       return df.format( decimal ); 
   } 
    
   /** 
   * 将不足四位的年份补足为四位 
   * @param decimal 
   * @return 
   */ 
   public static String formatYear(int decimal){ 
       DecimalFormat df = new DecimalFormat("0000"); 
       return df.format( decimal ); 
   } 
    
   /** 
   * 计算两个日期之间相隔的天数 
   * @param begin 
   * @param end 
   * @return 
   * @throws ParseException 
   */ 
   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 beginDate endDate 
   * @param days 
   * @return 
   */ 
   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); 
       for(int i = 0; i < days; i++){ 
           ymd = addOneDay(ymd[Y], ymd[M], ymd[D]); 
           everyDays.add(formatYear(ymd[Y])+"-"+formatMonthDay(ymd[M])+"-"+formatMonthDay(ymd[D])); 
       } 
       return everyDays; 
   } 
    
   public static void main(String[] args) { 
       List<String> list = CountDate.getEveryday("2014-08-29", "2015-09-02"); 
       for (String result : list) { 
           System.out.println(result); 
       } 
   } 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值