两个约会与joda时间的差异天数错误?

早上好,

我正在开发一个Android应用程序,我疯了! 几天后,我试着获得2个日期之间的差异。

我用joda时间意识到这一点 – 这似乎有效。

DatePicker datepicker = (DatePicker) findViewById(R.id.Picker); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, datepicker.getYear()); cal.set(Calendar.MONTH, datepicker.getMonth()); cal.set(Calendar.DATE, datepicker.getDayOfMonth()); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); long sqlDate = cal.getTimeInMillis(); Calendar calToday = Calendar.getInstance(); calToday.set(Calendar.YEAR, calToday.get(Calendar.YEAR)); calToday.set(Calendar.MONTH, calToday.get(Calendar.MONTH)); calToday.set(Calendar.DATE, calToday.get(Calendar.DATE)); calToday.set(Calendar.HOUR_OF_DAY, 0); calToday.set(Calendar.MINUTE, 0); calToday.set(Calendar.SECOND, 0); Date date1 = new Date( datePicker.getYear()-1900, datePicker.getMonth(), datePicker.getDayOfMonth() ); Date today = new Date( calToday.get(Calendar.YEAR)-1900, calToday.get(Calendar.MONTH), calToday.get(Calendar.DAY_OF_MONTH) ); int days = Days.daysBetween(new DateTime(today), new DateTime(date1)).getDays(); 

我将长sqlDate保存在我的数据库中。 这是日期选择器的日期,以毫秒为单位。

现在我想用查询请求这个日期,并计算日期(毫秒)和现在日期之间的差异天数。

我试试这个:

 Calendar calToday = Calendar.getInstance(); calToday.set(Calendar.YEAR, calToday.get(Calendar.YEAR)); calToday.set(Calendar.MONTH, calToday.get(Calendar.MONTH)); calToday.set(Calendar.DATE, calToday.get(Calendar.DATE)); calToday.set(Calendar.HOUR_OF_DAY, 0); calToday.set(Calendar.MINUTE, 0); calToday.set(Calendar.SECOND, 0); long now = calToday.getTimeInMillis(); long DiffDays = (sqlDate - now) / (24 * 60 * 60 * 1000); Log.e("-->", ""+sqlDate ); Log.e("-->", ""+now); Log.e("-->", ""+(sqlDate - now)); Log.e("-->", ""+DiffDays); Log.e("-->", "===================="); 

记录结果:

 12-02 07:19:09.931 26600-26600/? E/-->: 1451606400515 12-02 07:19:09.931 26600-26600/? E/-->: 1449014400938 12-02 07:19:09.931 26600-26600/? E/-->: 2591999577 12-02 07:19:09.931 26600-26600/? E/-->: 29 12-02 07:19:09.931 26600-26600/? E/-->: ==================== 12-02 07:19:09.931 26600-26600/? E/-->: 1449187200127 12-02 07:19:09.931 26600-26600/? E/-->: 1449014400942 12-02 07:19:09.931 26600-26600/? E/-->: 172799185 12-02 07:19:09.931 26600-26600/? E/-->: 1 12-02 07:19:09.931 26600-26600/? E/-->: ==================== 

但这是错误的。 例如:

这是SqlDate的结果 – 现在= 2591999577(毫秒)

2591999577 /(24 * 60 * 60 * 1000)= 29,9999(30天)不是29天

为什么得到ia十进制结果 – 我每次从00:00:00到00:00:00计算

我希望你能帮帮我 :’(

你没有把毫秒归零:)

尝试:

  Calendar calToday = Calendar.getInstance(); calToday.set(Calendar.YEAR, calToday.get(Calendar.YEAR)); calToday.set(Calendar.MONTH, calToday.get(Calendar.MONTH)); calToday.set(Calendar.DATE, calToday.get(Calendar.DATE)); calToday.set(Calendar.HOUR_OF_DAY, 0); calToday.set(Calendar.MINUTE, 0); calToday.set(Calendar.SECOND, 0); calToday.set(Calendar.MILLISECOND, 0); // this is important long now = calToday.getTimeInMillis(); long DiffDays = (sqlDate - now) / (24 * 60 * 60 * 1000); Log.e("-->", ""+sqlDate ); Log.e("-->", ""+now); Log.e("-->", ""+(sqlDate - now)); Log.e("-->", ""+DiffDays); Log.e("-->", "===================="); 

乔达时间?

除了最后一行,你没有使用Joda-Time 。

您正在使用与早期版本的Java捆绑在一起的旧的,麻烦的,令人沮丧的日期时间类:java.util.Date / .Calendar。 (好吧,在Android中,模仿旧类 – 更有问题,因为存在一些差异。)

为什么要把麻烦的老class级和Joda-Time混在一起? 如果您已经忘记了将Joda-Time jar添加到您的项目中,请坚持使用Joda-Time。

我强烈建议你确实学会使用Joda-Time。 这项工作将更容易,更准确。

时区

要计算好几天,考虑时区至关重要。 夏令时(DST)和其他exception会影响天数,这些调整因时区而异。

在问题中看到的代码中,JVM的当前默认时区隐式应用于新的DateTime实例。 这意味着当在各种计算机上运行时,或者使用不同的时区设置运行时,相同的代码可能会返回不同的结果。 请记住,当前默认时区可以通过在运行时随时调用TimeZone.setDefault来设置任何共享此JVM的应用程序的任何线程中的任何代码。 最好指定预期/预期的时区。

 DateTimeZone zone = DateTimeZone.forID( "America/Montral" ); DateTime now = DateTime.now( zone ); DateTime then = now.minusWeeks( 1 ); // Arbitrarily creating a moment in the past. Interval interval = new Interval( then , now ); // Interval is a pair of moments on the timeline defining a span of time. int days = Days.daysIn( interval ).getDays(); // First call returns `Days` object. Second call extracts the simple integer number of days as an `int`. 

这一天的第一个时刻

似乎你正试图开始一天的开始。 您假设当天从00:00:00.000 。 由于夏令时和可能的其他exception,情况并非总是如此。 让Joda-Time确定一天的开始。

 DateTime todayStart = DateTime.now( zone ).withTimeAtStartOfDay(); 

java.time

顺便说一句,在Java 8及更高版本中,Joda-Time由新的内置java.time框架inheritance。 Joda-Time仍然是一个活跃的受支持项目,尽管它的维护者建议程序员尽可能地转移到java.time。