早上好,
我正在开发一个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天
为什么得到一个小数结果 - 我每次从00:00:00到00:00:00计算
我希望你能帮助我:'(
答案 0 :(得分:1)
你没有把毫秒归零:)
尝试:
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("-->", "====================");
答案 1 :(得分:1)
您没有使用Joda-Time,但最后一行除外。
您正在使用与早期版本的Java捆绑在一起的旧的,麻烦的,令人沮丧的日期时间类:java.util.Date / .Calendar。 (好吧,在Android中,模仿旧类 - 更有问题,因为存在一些差异。)
为什么要把麻烦的旧课与Joda-Time混在一起?如果您已经忘记了将Joda-Time jar添加到您的项目中,请坚持使用Joda-Time。
我强烈建议你确实学会使用Joda-Time。这项工作将更容易,更准确。
要计算几天,考虑时区至关重要。夏令时(DST)和其他异常会影响天数,这些调整因时区而异。
在问题中看到的代码中,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
开始。由于夏令时和可能的其他异常现象,情况并非总是如此。让Joda-Time确定一天的开始。
DateTime todayStart = DateTime.now( zone ).withTimeAtStartOfDay();
顺便说一句,在Java 8及更高版本中,Joda-Time由新的内置java.time框架继承。 Joda-Time仍然是一个活跃的受支持项目,尽管它的维护者建议程序员尽可能转移到java.time。