java怎样控制迭代周期_如何在Java中迭代日期范围?
好吧,你可以使用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中迭代日期范围?相关推荐
- java怎样控制迭代周期_如何在Java 8中一年中每周迭代一次?
您可以使用以下内容构建日期并将其调整为一年中第一周的第一天: int year = 2016; WeekFields weekFields = WeekFields.ISO; LocalDate da ...
- java虚拟机的生命周期_深入理解Java虚拟机——JVM的生命周期
package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Run ...
- sql中日期的比较_如何在SQL中比较日期?
sql中日期的比较 How to compare date in SQL? For example, the 'users' table has a column 'loggin' which is ...
- java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素
如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...
- java 合并两个列表_如何在Java中合并两个列表?
java 合并两个列表 Merging two lists in Java is often a useful operation. These lists can be ArrayLists or ...
- java字符串字符排列组合_如何在Java中查找字符串的所有排列
java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...
- java类添加单元测试代码_如何在java中单元测试时跳过一段代码
如果问题确实是: 如何在Java 然后我给出的答案同意单元测试时,我跳过一段代码.依赖注入,嘲讽框架绝对是真正的单元测试的正确途径. 但是,如果问题是: 使用JUnit(或其他单元测试框架) 然后我想 ...
- java时间往后一天_如何在Java中将日期增加一天?
24个解决方案 617 votes 像这样的东西应该做的伎俩: String dt = "2008-01-01"; // Start date SimpleDateFormat s ...
- mysql怎么插入时间_如何在MySQL中插入日期?
在MySQL中插入日期的方法:首先打开脚本文件:然后通过[INSERT INTO tablename (col_name, col_date) VALUE ('DATE: Auto CURDATE() ...
最新文章
- Failed to load module canberra-gtk-module错误的解决方案
- 在kde中让gvim自动最大化
- 2012年的第一天 自己独自踏上回家的路 木有任何人相送
- 趣学python3(29)-集合set
- PWA将带来新一轮大前端技术洗牌?
- 计算机上的根号计算公式,根号计算公式
- 淘宝/天猫/京东/拼多多/苏宁易购/小米商城/华为商城/抖音快手直播/茅台抢购助手,宝惠抢购助手/OK助手源码
- 现在,让客服接管数字化企业
- MySQL查询为啥慢了?
- 2021-12-01 WPF上位机 103-西门子S7协议之V区,DB区读数据方法流程解析
- FTT暴雷加密熊市雪上加霜?如何对抗系统风险
- WCE 电源管理器(开胃菜)
- “李焕英效应”将长期主宰中国影视股投资逻辑
- 旅行青蛙破解汉化教程——蹭个热度
- TypeScript 用腻了?来换换口味吧——使用 ReScript + React 写一个简单的Todo List
- 一个动态ACL的案例
- Unknown custom element: <uploader> - did you register the component correctly? For recursive compone
- Centos 7 手把手教你部署gitlab-ce
- Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容
- error: 'lianxi/' does not have a commit checked out fatal: adding files failed 解决方案