在java中迭代日期

mgdq6dx1  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(353)

我需要重复一系列的日期。不知道第二天该怎么做。我正在使用 java.util.Date . 所以呢 plusDays(1) 不能在for循环中用于获取下一个日期。
使用 date1 = new Date(date1.getTime() + (1000 * 60 * 60 * 24)) 在for循环中。但是我不认为每次在for循环中调用new来创建对象是个好主意。
请建议一个更好的方式采取第二天在为循环。

jk9hmnmh

jk9hmnmh1#

热释光;博士

LocalDate.now().plusDays( 1 )  // Get tomorrow's date.

避免遗留日期时间类。

从不使用 java.util.Date .
多年前,jsr310中定义的现代java.time类取代了这个糟糕的类。同上 Calendar , GregorianCalendar ,和 SimpleDateFormat .

本地日期

对于仅日期值(不含时间和时区),请使用 LocalDate 班级。
呼叫 LocalDate.now 获取当前日期。
对于任何一个特定的时刻,全球各地的日期都因时区而异。因此,请指定要查看日期的时区。如果省略,则隐式应用jvm的当前默认时区。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;  // Capture the current date as seen in a particular time zone.
for ( int i = 0 ; i < 7 ; i++ )
{
    LocalDate localDate = today.plusDays( i );
    System.out.println( "localDate = " + localDate );
}

当你跑的时候。

localDate = 2020-12-17
localDate = 2020-12-18
localDate = 2020-12-19
localDate = 2020-12-20
localDate = 2020-12-21
localDate = 2020-12-22
localDate = 2020-12-23

如果您熟悉java流,请使用 LocalDate::datesUntil .

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );  // Capture the current date as seen in a particular time zone.
today.datesUntil( today.plusWeeks( 1 ) ).forEach( System.out :: println );

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
现在处于维护模式的joda time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线 java.sql.* 班级。hibernate5和jpa2.2支持java.time。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9带来了一些小的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android(26+)的更高版本捆绑了java.time类的实现。
对于早期的android(<26),一个称为api desugaring的过程带来了java.time功能的一个子集,这些功能最初没有内置到android中。
如果desugaring不能提供您所需要的,那么threetenabp项目将threeten backport(如上所述)改编为android。了解如何使用threetenabp…。

nukf8bse

nukf8bse2#

所有现有的答案都很好。这个答案提供了一些额外的信息,这些信息也可以解决你的问题,或者至少可以引导你走向正确的方向。

使用现代api:

import java.time.LocalDate;

class Main {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2020, 12, 5);// 5th Dec 2020
        LocalDate endDate = LocalDate.of(2020, 12, 15);// 15th Dec 2020
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            System.out.println(date);
        }
    }
}

输出:

2020-12-05
2020-12-06
2020-12-07
2020-12-08
2020-12-09
2020-12-10

如果日期是字符串对象:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d/M/uuuu");
        LocalDate startDate = LocalDate.parse("5/12/2020", dtf);// 5th Dec 2020
        LocalDate endDate = LocalDate.parse("10/12/2020", dtf);// 10th Dec 2020
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            System.out.println(date);
        }
    }
}

输出:

2020-12-05
2020-12-06
2020-12-07
2020-12-08
2020-12-09
2020-12-10

使用传统api:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(2020, 11, 5);// 5th Dec 2020
        Date startDate = calendar.getTime();

        calendar.set(2020, 11, 10);// 10th Dec 2020
        Date endDate = calendar.getTime();

        SimpleDateFormat sdfForOutput = new SimpleDateFormat("yyyy-MM-dd");
        Date date = startDate;
        for (calendar.setTime(startDate); !date.after(endDate); calendar.add(Calendar.DAY_OF_YEAR,
                1), date = calendar.getTime()) {
            System.out.println(sdfForOutput.format(date));
        }
    }
}

输出:

2020-12-05
2020-12-06
2020-12-07
2020-12-08
2020-12-09
2020-12-10

如果日期是字符串对象:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d/M/yyyy");
        Date startDate = sdfForParsing.parse("5/12/2020");// 5th Dec 2020
        Date endDate = sdfForParsing.parse("10/12/2020");// 10th Dec 2020
        Calendar calendar = Calendar.getInstance();

        SimpleDateFormat sdfForOutput = new SimpleDateFormat("yyyy-MM-dd");
        Date date = startDate;
        for (calendar.setTime(startDate); !date.after(endDate); calendar.add(Calendar.DAY_OF_YEAR,
                1), date = calendar.getTime()) {
            System.out.println(sdfForOutput.format(date));
        }
    }
}

输出:

2020-12-05
2020-12-06
2020-12-07
2020-12-08
2020-12-09
2020-12-10

注意,api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。在trail:date-time了解有关现代日期时间api的更多信息。
注意:无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

gwo2fgha

gwo2fgha3#

你可以用 plusDays() 通过转换 Date 进入 LocalDate :

import java.util.*;
import java.time.*;

public class MyClass {
    public static void main(String args[]) {
        Date date = new Date();
        LocalDate dateCopy =  date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        System.out.println("Date:  " + dateCopy);

        for(int counter = 1; counter <= 5; counter++){
            dateCopy = dateCopy.plusDays(1);
            System.out.println("Date:  " + dateCopy);

        }
    }
}

注意,我使用相同的 dateCopy 变量,因为plusdays()返回 LocalDate 我不想创建新的变量。
上述代码将生成以下控制台日志:

Date:  2020-12-17
Date:  2020-12-18
Date:  2020-12-19
Date:  2020-12-20
Date:  2020-12-21
Date:  2020-12-22
qojgxg4l

qojgxg4l4#

正如其他人所说,避免使用 java.util.Date 如果有办法的话。喜欢巴兹尔布尔克的好答案。
有时,我们需要与使用遗留日期时间类的遗留代码进行互操作 Date 我们不能马上升级到java.time。
如果你得到一个 Date 形成一个遗留api,使用ariefbayu的答案。
如果相反,每次迭代都需要一个老式的 Date 对象,我将向您展示如何。

LocalDate startDateInclusive = LocalDate.of(2021, Month.MARCH, 12);
 LocalDate endDateExlusive = LocalDate.of(2021, Month.MARCH, 17);

 startDateInclusive.datesUntil(endDateExlusive)
         .map(d -> d.atStartOfDay(ZoneId.systemDefault()))
         .map(ZonedDateTime::toInstant)
         .map(Date::from)
         .forEach(System.out::println);

我查了这个片段 America/Cambridge_Bay 时区并得到以下输出:

Fri Mar 12 00:00:00 MST 2021
Sat Mar 13 00:00:00 MST 2021
Sun Mar 14 00:00:00 MST 2021
Mon Mar 15 00:00:00 MDT 2021
Tue Mar 16 00:00:00 MDT 2021
``` `LocalDate.datesUnitil()` 给了我们一股 `LocalDate` s。通过一系列的 `map` 我转换每个 `LocalDate` 到 `Date` 我终于打印出来了。您不需要打印,而是需要调用一个或多个旧方法,例如:

.forEach(jud -> {
someLegayMethod(jud);
someOtherLegacyMethod(jud, "some other argument");
});

在上面的输出中,您将注意到java知道夏季时间(dst)是在3月14日引入的,因此从3月15日起时区的缩写是 `MDT` 在山上的白天而不是 `MST` 山地标准时间。两人之间只有23个小时 `Date` 当他们都在00:00掉下来的时候。
使用 `date1 = new Date(date1.getTime() + (1000 * 60 * 60 * 24))` 在for循环中。但是我不认为每次在for循环中调用new来创建对象是个好主意。
每次创建一个新对象都没有问题(除非在非常特殊的情况下)。您的代码不好还有其他几个原因:
自己计算时间是个坏习惯。我们应该依靠图书馆的课程,因为
答。它提供了更清晰易读的代码
b。日期和时间的数学往往比我们想象的要复杂,因此很容易出错;具体来说,我们可能会错过很多角落的情况下,往往不被注意到在测试。
您的代码假定一天总是24小时。正如我上面所说,情况并非如此。

### 链接

oracle教程:date time解释如何使用java.time。

相关问题