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

时间:2015-12-02 06:43:47

标签: java android mysql xml date

早上好,

我正在开发一个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计算

我希望你能帮助我:'(

2 个答案:

答案 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)

约达通时间ΔT

您没有使用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.time

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