欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA时间日期处理类,主要用来遍历两个日期之间的每一天

程序员文章站 2022-11-13 21:13:25
import java.text.DecimalFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;impo ......

import java.text.decimalformat;
import java.text.parseexception;
import java.text.simpledateformat;
import java.util.arraylist;
import java.util.date;
import java.util.list;

/**
* 遍历两个时间段中间的每一天
* @author 天涯鬼域
* 2019.01.30
*/
public class accountdate {

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 = accountdate.geteveryday("2008-08-29", "2008-09-02");
for (string result : list) {
system.out.println(result);
}
}
}