【问题标题】:Get difference between Date objects with the day shortcode使用日期短代码获取 Date 对象之间的差异
【发布时间】:2014-07-03 15:59:17
【问题描述】:

我正在尝试建立一种机制来计算两个日期对象之间的差异,但我遇到了问题。 我将转换为 Date 对象的第一个输入是:

Ma 14:00

这意味着“星期一 14:00”。我正在使用以下代码将此字符串转换为日期对象。

try {
        date = new SimpleDateFormat("EE HH:mm", Locale.getDefault()).parse(msg);
        Log.i("intent", "Date: " + date);
    } catch (ParseException e) {
        e.printStackTrace();
    }

如果我打印 Date 对象,它是“Mon Jan 05 14:00:00 CET 1970”。我只对日期名称和时间感兴趣,所以我没有费心更改日期对象的其他部分。

我的问题如下:我需要知道现在的日子(例如:星期四)和上面的日子(例如:星期一)之间的区别。

我尝试执行以下操作:

    Date dateNow = new Date();
    dateNow.setHours(date.getHours());
    dateNow.setMinutes(date.getMinutes());
    dateNow.setSeconds(date.getSeconds());
    dateNow.setYear(70);
    dateNow.setMonth(0);
    Log.i("DAYS TAG", ""+dateNow);
    long diff = date.getTime() - dateNow.getTime();
    long seconds = diff / 1000;
    long minutes = seconds / 60;
    long hours = minutes / 60;
    long days = hours / 24;
    Log.i("DAYS TAG", ""+days);

这种方法行不通,因为我正在处理这些日子,但日子是负数或有时不准确。

基本上我想要的是这样的:

  • 获取即将到来的日期的日期(与星期一一样)
  • 获取当前日期(星期四)
  • 计算这几天(4 天)之间的差异

通过这些步骤,我发现了这个:

        Calendar now = Calendar.getInstance();
    int weekday = now.get(Calendar.DAY_OF_WEEK);
    if(weekday != Calendar.MONDAY){
        int days = (Calendar.SATURDAY - weekday + 2) %7;
        now.add(Calendar.DAY_OF_YEAR, days);
    }

这将获取即将到来的星期一的日期。就像我在第一步中想要的那样。但是,当我添加旧日期时,它不再起作用。它给出了错误的日期。更新后的代码是:

        //get difference in days between now and date object.
    Calendar old = Calendar.getInstance();
    old.setTime(date);

    Log.i("...",""+old.get(Calendar.DAY_OF_WEEK));

    Calendar now = Calendar.getInstance();
    int weekday = now.get(Calendar.DAY_OF_WEEK);
    if(weekday != Calendar.MONDAY){
        int days = (Calendar.SATURDAY - weekday + 2) %7;
        now.add(Calendar.DAY_OF_YEAR, days);
    }

    Date date2 = now.getTime();
    Log.i("tag", ""+date2);

但正如我所说,它返回了错误的日期。

如果有人能提供帮助,我将不胜感激。因为我已经为此工作了几个小时。

【问题讨论】:

  • 您提出了多个问题。 StackOverflow 在专注于单个 sep 时效果最佳
  • @BasilBourque 它基于一个问题。但我把它分成多个部分,这样就很清楚了。另外,我给出的所有例子都是针对那个问题的。
  • 此外,您的所有问题都已被问及回答 很多次 次。发帖前先搜索。您将学会避免使用 j.u.Date 和 .Calendar 类,永远不要有效地使用 j.u.Date 的 toString 方法,因为它的格式和默认时区很糟糕,使用 Joda-Time 或新的 java.time 库,使用Joda-Time 中的 3 个不同的类以不同的方式处理时间跨度。
  • 而且,当询问翻译“Ma”时,您应该提及语言。
  • 我知道 JodaTime,但我知道使用普通 Java 是可能的。我还希望我的 .apk 变得尽可能小。但是如果我的问题已经被回答了很多次,请提供一些链接,因为我找不到这个问题(使用当天的简码,没有已知的有效日期)。提前致谢。

标签: java android date


【解决方案1】:

因为这个问题不是重复的,所以我将在此处粘贴我的问题的解决方案。

                String upcomingAlarmString = Settings.System.getString(getActivity().getContentResolver(),
                    Settings.System.NEXT_ALARM_FORMATTED);
            Calendar tempDate = Calendar.getInstance();
            try{
                SimpleDateFormat format = new SimpleDateFormat("EE HH:mm", Locale.getDefault());
                tempDate.setTime(format.parse(upcomingAlarmString));
            } catch (ParseException e){
                e.printStackTrace();
            }

            Calendar alarmDate = Calendar.getInstance();
            while(alarmDate.get(Calendar.DAY_OF_WEEK) != tempDate.get(Calendar.DAY_OF_WEEK)){
                if(alarmDate.get(Calendar.DAY_OF_WEEK)==7)
                    alarmDate.set(Calendar.WEEK_OF_YEAR, alarmDate.get(Calendar.WEEK_OF_YEAR) + 1);

                alarmDate.set(Calendar.DAY_OF_WEEK, alarmDate.get(Calendar.DAY_OF_WEEK)+1);
            }

            alarmDate.set(Calendar.HOUR, tempDate.get(Calendar.HOUR));
            alarmDate.set(Calendar.MINUTE, tempDate.get(Calendar.MINUTE));
            alarmDate.set(Calendar.SECOND, 0);

            System.out.println("alarmDate: " + alarmDate.getTime());
            System.out.println("calculate difference between alarmDate and now = number of days extra");

如您所见,我正在使用 while 循环来获取正确的日期。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2017-03-27
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多