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);
}
}
}

转载于:https://www.cnblogs.com/gxr-tygy/p/10337864.html

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

  1. R语言筛选dataframe中两个日期之外的数据行,介于两个日期(包括两个日期)之间的数据行

    R语言筛选dataframe中两个日期之外的数据行,介于两个日期(包括两个日期)之间的数据行 目录

  2. java遍历两个时间戳之间的每一天

    java遍历两个时间戳之间的每一天 一度为快 时间戳 开始时间戳:1571328000 结束时间戳:1571500800 结果 关键代码 private static void getDays(lon ...

  3. Shell--计算两个日期的相差天数及输出这两个日期内的所有日期【工作笔记】

    定义脚本 vim calculateDate.sh如下: #!/bin/sh startDate="20210801" endDate="20210826" e ...

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

    /** * * 文 件 名: AccountDate.java * * 创建时间: 2008-11-18 * * Email : **@163.com */import java.text.Decim ...

  5. Java时间处理工具类(详细)

    目录 第一类: 第二类: 第一类: package com.chinamcloud.spiderMember.util;import org.apache.commons.lang3.StringUt ...

  6. 非常强大的java时间处理工具类!

    xk-time 是时间转换,时间计算,时间格式化,时间解析,日历,时间cron表达式和时间NLP等的工具,使用Java8,线程安全,简单易用,多达70几种常用日期格式化模板,支持Java8时间类和Da ...

  7. 正方形类的定义,比较两个日期的大小并计算其间隔天数

    实验项目5:常用实用类 一.实验目的和要求 学会覆盖Object类中常用方法: 学会使用Math类中常用方法: 学会字符串的常用操作: 学会常用日期类的使用方法. 二.实验内容与步骤 1.定义一个名为 ...

  8. java 计算两个日期相差月数_Java简单计算两个日期月数差的方法

    本文实例讲述了Java简单计算两个日期月数差的方法.分享给大家供大家参考,具体如下: /** * 获取两个日期相差的月数 * @param d1 较大的日期 * @param d2 较小的日期 * @ ...

  9. java 日期只计算年月日大小_Java 计算两个日期相差多少年月日

    JDK7及以前的版本,计算两个日期相差的年月日比较麻烦. JDK8新出的日期类,提供了比较简单的实现方法. /*** 计算2个日期之间相差的 相差多少年月日 * 比如:2011-02-02 到 201 ...

最新文章

  1. 最新单步目标检测框架,引入双向网络,精度和速度均达到不错效果
  2. 计算机辅助药物合成投什么期刊,中国药物化学杂志审稿快吗
  3. Spring.Net 能为我们做点什么
  4. 全国计算机一级考试的练题软件,2017全国计算机一级考试WPS备考练习题
  5. mysql 优化语句
  6. 文件系统的简单的操作
  7. [转]C#正则表达式小结
  8. vba mysql 80004005_Access运行时错误'-2147467259(80004005)':方法'Controls'作用于对象'CommandBarPopup'时失败的解决方法...
  9. 联想 K5 Pro(L38041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.188
  10. 学习廖雪峰的Python教程之Python基础
  11. exagear安装java_exagear模拟器怎么使用 exagear模拟器使用方法安装教程
  12. 海南大学信号与系统838报考高频问题整理(4)
  13. 基于HTML和CSS完成京东页面的制作
  14. Accumulation
  15. 如何取消excel密码_Excel表格技巧—Excel表格如何取消密码
  16. 数据库云管平台 zCloud v3.5发布,智能化和国产数据库支持能力再增强
  17. 北京2008中国代表团名单
  18. stata最大值最小值命令_听说会Stata的人,数学不会太差?
  19. 推荐一个Arduino学习模拟器: 123D Circuites
  20. 游戏修改器DIY(一)

热门文章

  1. 2017华为软件精英挑战赛小结
  2. 史上最全的FTP网址
  3. 极智AI | 一文看懂昇腾达芬奇架构计算单元
  4. SpringCloud系列之六
  5. 数加平台——阿里大数据OS实践
  6. 计算机串行总线控制器,通用串行总线控制器出现叹号是什么情况?怎么解决?...
  7. 怎么保存网页为html格式,怎样保存网页部分内容为html格式?
  8. altera fpga大小如何衡量_Xilinx和Altera FPGA的基本逻辑单元对比
  9. Java--反射(框架设计的灵魂)
  10. Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment4