Answers:
令人讨厌的是,withTimeAtStartOfDay答案是错误的,但只是偶尔出现。你要:
Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()
事实证明,“午夜/一天的开始时间”有时是指凌晨1点(某些地方以这种方式实现夏令时),而Days.daysBetween无法正常处理。
// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
end.toLocalDate()).getDays());
// prints 1
通过走出去LocalDate
回避了整个问题。
Instant
,您不仅在谈论start.toInstant()
,是吗?
Days
类将Days
类与withTimeAtStartOfDay
方法一起使用应该可以:
Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays()
toDateMidnight()
不建议使用DateTime类型的方法。
end
之前的start
,会返回负数天怎么办?
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…要么…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。
乔达-时间的等效DateTime
是ZonedDateTime
。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
显然,您想按日期计算天数,这意味着您想忽略一天中的时间。例如,从午夜之前的一分钟开始,到午夜之后的一分钟结束,应该是一天。对于这种行为,提取LocalDate
从你的ZonedDateTime
。该LocalDate
级表示没有时间一天和不同时区的日期,唯一的价值。
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
使用ChronoUnit
枚举来计算经过的天数或其他单位。
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
至于您要问的是一种更通用的计数方法,请使用该方法,在该方法中,您对小时增量表示为小时,而不是完整小时数表示为60分钟truncatedTo
。
这是您当天14:45至15:12的示例。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );
long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
1个
这几天无法使用。在这种情况下,请使用toLocalDate()。
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。java.sql.*
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能向java.time添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能向java.time添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
可接受的答案将生成两个LocalDate
对象,如果您正在读取大量数据,则这将是非常昂贵的。我用这个:
public static int getDaysBetween(DateTime earlier, DateTime later)
{
return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
}
通过调用,getMillis()
您可以使用已有的变量。
MILLISECONDS.toDays()
然后,使用简单的算术计算,不创建任何对象。
java.time.Period
由于Java 8计算差值更直观使用LocalDate
,LocalDateTime
来表示两个日期
LocalDate now = LocalDate.now();
LocalDate inputDate = LocalDate.of(2018, 11, 28);
Period period = Period.between( inputDate, now);
int diff = period.getDays();
System.out.println("diff = " + diff);
DateTime dt = new DateTime(laterDate);
DateTime newDate = dt.minus( new DateTime ( previousDate ).getMillis());
System.out.println("No of days : " + newDate.getDayOfYear() - 1 );
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
final int SECONDS = 60;
final int MINUTES = 60;
final int HOURS = 24;
final int MILLIES = 1000;
long temp;
if (timestamp1 < timestamp2) {
temp = timestamp1;
timestamp1 = timestamp2;
timestamp2 = temp;
}
Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
endDate.setTimeInMillis(timestamp1);
startDate.setTimeInMillis(timestamp2);
if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
int day1 = endDate.get(Calendar.DAY_OF_MONTH);
int day2 = startDate.get(Calendar.DAY_OF_MONTH);
if (day1 == day2) {
return 0;
} else {
return 1;
}
}
int diffDays = 0;
startDate.add(Calendar.DAY_OF_MONTH, diffDays);
while (startDate.before(endDate)) {
startDate.add(Calendar.DAY_OF_MONTH, 1);
diffDays++;
}
return diffDays;
}
Days.daysBetween
不正确的特定数据?