两个约会与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。