好吧,你可以使用Java 8的time-API做这样的事情,特别是这个问题java.time.LocalDate(或Java 7及更早版本的等效Joda Time类)

for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1))

{

...

}

我会建议在内置的Date/Calendar课程中使用java.time(或Joda Time)。

JodaTime很不错,但是,为了完整性和/或如果您更喜欢API提供的设施,这里是标准的API方法。

当开始使用如下的java.util.Date实例时:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date startDate = formatter.parse("2010-12-20");

Date endDate = formatter.parse("2010-12-26");

如果您还没有使用Java8,这是传统的java.util.Calendar方法:

Calendar start = Calendar.getInstance();

start.setTime(startDate);

Calendar end = Calendar.getInstance();

end.setTime(endDate);

for (Date date = start.getTime(); start.before(end); start.add(Calendar.DATE, 1), date = start.getTime()) {

// Do your job here with `date`.

System.out.println(date);

}

这是Java8的java.time.LocalDate方法,基本上就是JodaTime方法:

LocalDate start = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate end = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {

// Do your job here with `date`.

System.out.println(date);

}

如果您想迭代包含结束日期,则分别使用!start.after(end)和!date.isAfter(end)。

Java 8样式,使用java.time类:

// Monday, February 29 is a leap day in 2016 (otherwise, February only has 28 days)

LocalDate start = LocalDate.parse("2016-02-28"),

end = LocalDate.parse("2016-03-02");

// 4 days between (end is inclusive in this example)

Stream.iterate(start, date -> date.plusDays(1))

.limit(ChronoUnit.DAYS.between(start, end) + 1)

.forEach(System.out::println);

输出:

2016-02-28

2016-02-29

2016-03-01

2016-03-02

替代方案:

LocalDate next = start.minusDays(1);

while ((next = next.plusDays(1)).isBefore(end.plusDays(1))) {

System.out.println(next);

}

Java 9添加了datesUntil()方法:

start.datesUntil(end.plusDays(1)).forEach(System.out::println);

这与BalusC给出的答案基本相同,但使用while循环代替for循环更具可读性:

Calendar start = Calendar.getInstance();

start.setTime(startDate);

Calendar end = Calendar.getInstance();

end.setTime(endDate);

while( !start.after(end)){

Date targetDay = start.getTime();

// Do Work Here

start.add(Calendar.DATE, 1);

}

private static void iterateBetweenDates(Date startDate, Date endDate) {

Calendar startCalender = Calendar.getInstance();

startCalender.setTime(startDate);

Calendar endCalendar = Calendar.getInstance();

endCalendar.setTime(endDate);

for(; startCalender.compareTo(endCalendar)<=0;

startCalender.add(Calendar.DATE, 1)) {

// write your main logic here

}

}

Apache Commons

for (Date dateIter = fromDate; !dateIter.after(toDate); dateIter = DateUtils.addDays(dateIter, 1)) {

// ...

}

public static final void generateRange(final Date dateFrom, final Date dateTo)

{

final Calendar current = Calendar.getInstance();

current.setTime(dateFrom);

while (!current.getTime().after(dateTo))

{

// TODO

current.add(Calendar.DATE, 1);

}

}

这是Java 8代码。我认为这段代码可以解决你的问题。快乐的编码

LocalDate start = LocalDate.now();

LocalDate end = LocalDate.of(2016, 9, 1);//JAVA 9 release date

Long duration = start.until(end, ChronoUnit.DAYS);

System.out.println(duration);

// Do Any stuff Here there after

IntStream.iterate(0, i -> i + 1)

.limit(duration)

.forEach((i) -> {});

//old way of iteration

for (int i = 0; i < duration; i++)

System.out.print("" + i);// Do Any stuff Here

为什么不使用epoch并轻松循环。

long startDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(startDate).getTime() / 1000;

long endDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(endDate).getTime() / 1000;

long i;

for(i=startDateEpoch ; i<=endDateEpoch; i+=86400){

System.out.println(i);

}

这将帮助您在30天后开始并循环到今天的日期。您可以轻松更改日期和方向的范围。

private void iterateThroughDates() throws Exception {

Calendar start = Calendar.getInstance();

start.add(Calendar.DATE, -30);

Calendar end = Calendar.getInstance();

for (Calendar date = start; date.before(end); date.add(Calendar.DATE, 1))

{

System.out.println(date.getTime());

}

}

你可以编写一个类似的类(实现迭代器接口)并迭代它。

public class DateIterator implements Iterator, Iterable

{

private Calendar end = Calendar.getInstance();

private Calendar current = Calendar.getInstance();

public DateIterator(Date start, Date end)

{

this.end.setTime(end);

this.end.add(Calendar.DATE, -1);

this.current.setTime(start);

this.current.add(Calendar.DATE, -1);

}

@Override

public boolean hasNext()

{

return !current.after(end);

}

@Override

public Date next()

{

current.add(Calendar.DATE, 1);

return current.getTime();

}

@Override

public void remove()

{

throw new UnsupportedOperationException(

"Cannot remove");

}

@Override

public Iterator iterator()

{

return this;

}

}

并使用它像:

Iterator dateIterator = new DateIterator(startDate, endDate);

while(dateIterator.hasNext()){

Date selectedDate = dateIterator .next();

}

我们可以将逻辑迁移到各种方法:

public static List getDatesRangeJava7(Date startDate, Date endDate) {

List datesInRange = new ArrayList<>();

Calendar startCalendar = new GregorianCalendar();

startCalendar.setTime(startDate);

Calendar endCalendar = new GregorianCalendar();

endCalendar.setTime(endDate);

while (startCalendar.before(endCalendar)) {

Date result = startCalendar.getTime();

datesInRange.add(result);

startCalendar.add(Calendar.DATE, 1);

}

return datesInRange;

}

public static List getDatesRangeJava8(LocalDate startDate, LocalDate endDate) {

int numOfDays = (int) ChronoUnit.DAYS.between(startDate, endDate);

return IntStream.range(0, numOfDays)

.mapToObj(startDate::plusDays)

.collect(Collectors.toList());

}

public static List getDatesRangeJava9(LocalDate startDate, LocalDate endDate) {

return startDate.datesUntil(endDate).collect(Collectors.toList());

}

然后我们可以调用这些方法:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date startDate = formatter.parse("2010-12-20");

Date endDate = formatter.parse("2010-12-26");

List dateRangeList = getDatesRangeJava7(startDate, endDate);

System.out.println(dateRangeList);

LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

List dateRangeList8 = getDatesRangeJava8(startLocalDate, endLocalDate);

System.out.println(dateRangeList8);

List dateRangeList9 = getDatesRangeJava8(startLocalDate, endLocalDate);

System.out.println(dateRangeList9);

输出将是:

[2010年12月20日00:00:00 IST 2010年12月21日00:00:00 IST 2010年12月12日星期三

22 00:00:00 IST 2010,Thu Dec 23 00:00:00 IST 2010,Fri Dec 24

00:00:00 IST 2010,Sat Dec 25 00:00:00 IST 2010]

[2010-12-20,2010-12-21,2010-12-22,2010-12-12,2010-12-24,

2010-12-25]

[2010-12-20,2010-12-21,2010-12-22,2010-12-12,2010-12-24,

2010-12-25]

java怎样控制迭代周期_如何在Java中迭代日期范围?相关推荐

  1. java怎样控制迭代周期_如何在Java 8中一年中每周迭代一次?

    您可以使用以下内容构建日期并将其调整为一年中第一周的第一天: int year = 2016; WeekFields weekFields = WeekFields.ISO; LocalDate da ...

  2. java虚拟机的生命周期_深入理解Java虚拟机——JVM的生命周期

    package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Run ...

  3. sql中日期的比较_如何在SQL中比较日期?

    sql中日期的比较 How to compare date in SQL? For example, the 'users' table has a column 'loggin' which is ...

  4. java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素

    如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...

  5. java 合并两个列表_如何在Java中合并两个列表?

    java 合并两个列表 Merging two lists in Java is often a useful operation. These lists can be ArrayLists or ...

  6. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  7. java类添加单元测试代码_如何在java中单元测试时跳过一段代码

    如果问题确实是: 如何在Java 然后我给出的答案同意单元测试时,我跳过一段代码.依赖注入,嘲讽框架绝对是真正的单元测试的正确途径. 但是,如果问题是: 使用JUnit(或其他单元测试框架) 然后我想 ...

  8. java时间往后一天_如何在Java中将日期增加一天?

    24个解决方案 617 votes 像这样的东西应该做的伎俩: String dt = "2008-01-01"; // Start date SimpleDateFormat s ...

  9. mysql怎么插入时间_如何在MySQL中插入日期?

    在MySQL中插入日期的方法:首先打开脚本文件:然后通过[INSERT INTO tablename (col_name, col_date) VALUE ('DATE: Auto CURDATE() ...

最新文章

  1. Failed to load module canberra-gtk-module错误的解决方案
  2. 在kde中让gvim自动最大化
  3. 2012年的第一天 自己独自踏上回家的路 木有任何人相送
  4. 趣学python3(29)-集合set
  5. PWA将带来新一轮大前端技术洗牌?
  6. 计算机上的根号计算公式,根号计算公式
  7. 淘宝/天猫/京东/拼多多/苏宁易购/小米商城/华为商城/抖音快手直播/茅台抢购助手,宝惠抢购助手/OK助手源码
  8. 现在,让客服接管数字化企业
  9. MySQL查询为啥慢了?
  10. 2021-12-01 WPF上位机 103-西门子S7协议之V区,DB区读数据方法流程解析
  11. FTT暴雷加密熊市雪上加霜?如何对抗系统风险
  12. WCE 电源管理器(开胃菜)
  13. “李焕英效应”将长期主宰中国影视股投资逻辑
  14. 旅行青蛙破解汉化教程——蹭个热度
  15. TypeScript 用腻了?来换换口味吧——使用 ReScript + React 写一个简单的Todo List
  16. 一个动态ACL的案例
  17. Unknown custom element: <uploader> - did you register the component correctly? For recursive compone
  18. Centos 7 手把手教你部署gitlab-ce
  19. Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容
  20. error: 'lianxi/' does not have a commit checked out fatal: adding files failed 解决方案

热门文章

  1. mysql时间间隔年份_MySQL DATEDIFF函数获取两个日期的时间间隔的方法
  2. Mysql之show profiles
  3. scrapy Crawl_spider
  4. 小狼程序员:工作遐想
  5. bzoj2127: happiness
  6. 工作流activiti5 使用流程变量
  7. 关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案
  8. SDOI 2009 BIll的挑战
  9. c#中字符串截取使用的方法
  10. 一文读懂Java多线程原理