我试图生成日期x和日期y之间的日期范围,但失败了.我在c#中使用相同的方法,所以我尝试尽可能多地修改它但是没有得到结果.知道我能解决什么吗?
private ArrayList<Date> GetDateRange(Date start, Date end) {
if(start.before(end)) {
return null;
}
int MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
ArrayList<Date> listTemp = new ArrayList<Date>();
Date tmpDate = start;
do {
listTemp.add(tmpDate);
tmpDate = tmpDate.getTime() + MILLIS_IN_DAY;
} while (tmpDate.before(end) || tmpDate.equals(end));
return listTemp;
}
Run Code Online (Sandbox Code Playgroud)
说实话,我试图让所有日期从1月1日开始到2012年12月31日结束.如果有更好的方法,请告诉我.谢谢
Mat*_*teo 14
java中的日历和日期API真的很奇怪......我强烈建议考虑jodatime,它是处理日期的事实上的库.它真的很强大,你可以从快速入门中看到:http://joda-time.sourceforge.net/quickstart.html.
此代码使用Joda-Time解决了这个问题:
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
public class DateQuestion {
public static List<DateTime> getDateRange(DateTime start, DateTime end) {
List<DateTime> ret = new ArrayList<DateTime>();
DateTime tmp = start;
while(tmp.isBefore(end) || tmp.equals(end)) {
ret.add(tmp);
tmp = tmp.plusDays(1);
}
return ret;
}
public static void main(String[] args) {
DateTime start = DateTime.parse("2012-1-1");
System.out.println("Start: " + start);
DateTime end = DateTime.parse("2012-12-31");
System.out.println("End: " + end);
List<DateTime> between = getDateRange(start, end);
for (DateTime d : between) {
System.out.println(" " + d);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用这个功能:
public static Date addDay(Date date){
//TODO you may want to check for a null date and handle it.
Calendar cal = Calendar.getInstance();
cal.setTime (date);
cal.add (Calendar.DATE, 1);
return cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)
在这里找到. 失败的原因是什么?为什么你认为你的代码失败了?
从Java 8开始,其他答案已过时。
与Java早期版本捆绑在一起的旧日期时间类已被内置在Java 8及更高版本中的java.time框架取代。请参阅教程。
LocalDate (仅日期)如果您只关心日期而不是时间,请使用LocalDate该类。该LocalDate级表示日期,只值,没有时间的天,没有时区。
LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
Run Code Online (Sandbox Code Playgroud)
要获取当前日期,请指定一个时区。在任何给定的时刻,今天的日期都会随时区而变化。例如,巴黎的新天要比蒙特利尔早。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Run Code Online (Sandbox Code Playgroud)
我们可以使用isEqual,isBefore和isAfter方法比较。在日期时间工作中,我们通常使用Half-Open方法,其中时间跨度的开始是包含在内的,而结束时间是排除的。
List<LocalDate> localDates = new ArrayList<>();
LocalDate localDate = start;
while ( localDate.isBefore( stop ) ) {
localDates.add( localDate );
// Set up the next loop.
localDate = localDate.plusDays( 1 );
}
Run Code Online (Sandbox Code Playgroud)
Instant (约会时间)如果您有旧的java.util.Date对象,它们同时表示日期和时间,请转换为Instant该类。一个Instant是UTC时间线上的时刻。
Instant startInstant = juDate_Start.toInstant();
Instant stopInstant = juDate_Stop.toInstant();
Run Code Online (Sandbox Code Playgroud)
从这些Instant对象中,LocalDate通过以下方法获取对象:
ZonedDateTime对象。该对象与时间轴上的时刻相同,Instant但分配了特定的时区。ZonedDateTime为LocalDate。我们必须应用时区,因为日期仅在时区的上下文中具有含义。如上所述,在任何给定的时刻,日期在世界各地都不同。
示例代码。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate start = ZonedDateTime.ofInstant( startInstant , zoneId ).toLocalDate();
LocalDate stop = ZonedDateTime.ofInstant( stopInstant , zoneId ).toLocalDate();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14034 次 |
| 最近记录: |