我正在寻找一个java库,当它从到目前为止提供时,将返回最适用的周,月,季度或年份的日期列表。我手动完成了这项工作,我想知道这是否已经实施并作为标准软件包的一部分进行测试。
实施例
鉴于2009年1月1日,2009年1月4日应该给出1/1 / 2009,1 / 2 / 2009,1 / 3 / 2009,1 / 4/2009
鉴于2009年1月1日,2009年1月14日,它应该给予1/1 / 2009,1 / 7 / 2009,1 / 14/2009
希望你明白:)
答案 0 :(得分:8)
DateTime提供的Joda Time课程有plusDays(int)
,plusWeeks(int)
,plusMonths(int)
等方法可以提供帮助。
假设您想要在几周内获得start
和end
之间的所有日期(伪代码):
DateTime start = // whatever
DateTime end = // whatever
List<DateTime> datesBetween = new ArrayList<DateTime>();
while (start <= end) {
datesBetween.add(start);
DateTime dateBetween = start.plusWeeks(1);
start = dateBetween;
}
答案 1 :(得分:3)
Jadoo的替代方法是使用标准java API
Calendar start = // whatever
Calendar end = // whatever
List<Calendar> datesBetween = new ArrayList<Calendar>();
while (start.compareTo(end) <= 0) {
datesBetween.add(start);
Calendar dateBetween = start.add(Calendar.DAY_OF_MONTH, 7);
start = dateBetween;
}
答案 2 :(得分:0)
使用jodatime在大范围内创建日期分割的示例java实现,内存占用最少。
https://github.com/atulsm/Test_Projects/blob/master/src/DateSplitter.java
答案 3 :(得分:0)
Answer by Dónal using Joda-Time是正确的,但过时了。 Joda-Time团队建议我们应该迁移到Java 8及更高版本中内置的java.time框架。 java.time的大部分功能都是back-ported to Java 6 & 7和adapted to Android。
LocalDate
对于仅限日期的值,没有时间和没有时区,请使用LocalDate
类。
通常,处理一段时间的最佳做法称为半开放式。在此方法中,跨度的开头是包含,而结尾是独占。因此,使用下面的示例代码,您将看到结果不包含stop
日期。如果您坚持将结尾包含在内,请将date.isBefore ( stop )
更改为! date.isAfter ( stop )
。
在目前的状态下,问题含糊不清,没有解决诸如是否考虑开始日期是否与周初或月初等对齐等问题。另一个问题:是否使用半开放方法。所以这些问题留给读者练习。 ; - )
此代码计算时间跨度内的天数。如果在一周之内,我们会逐日循环。如果超过一周,我们会逐周循环。如问题中所述,可以扩展相同的逻辑以逐月,逐季和逐年处理。
LocalDate start = LocalDate.of ( 2016 , Month.JANUARY , 2 );
LocalDate stop = start.plusDays ( 4 );
// LocalDate stop = start.plusWeeks ( 4 );
long days = ChronoUnit.DAYS.between ( start , stop );
List<LocalDate> dates = new ArrayList<> ();
if ( days == 0 ) {
dates.add ( start );// Just one date, as start equals stop.
} else if ( days < 7 ) { // Under a week, count day-by-day.
LocalDate date = start;
do {
dates.add ( date );
// Prep for next loop.
date = date.plusDays ( 1 );
} while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.
} else if ( days > 7 ) { // Over a week, count week-by-week.
LocalDate date = start;
do {
dates.add ( date );
// Prep for next loop.
date = date.plusWeeks ( 1 );
} while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.
} else {
// FIXME: ERROR. Should not be possible.
}
转储到控制台。
System.out.println ( "start: " + start + " | stop: " + stop + " | dates: " + dates );
使用stop
添加4 天的行
开始:2016-01-02 |停止:2016-01-06 |日期:[2016-01-02,2016-01-03,2016-01-04,2016-01-05]
使用stop
添加4 周的行
开始:2016-01-02 |停止:2016-01-30 |日期:[2016-01-02,2016-01-09,2016-01-16,2016-01-23]