【问题标题】:Android: compare calendar datesAndroid:比较日历日期
【发布时间】:2012-04-14 17:02:44
【问题描述】:

在我的应用程序中,我正在保存上次从服务器更新一些数据时的数据。 因此我使用了:

long time = Calendar.getInstance().getTimeInMillis();

现在我希望数据在 03.03 和 08.08 每年更新两次。 我如何检查自上次更新以来这两个日期边界中的一个是否越界?

【问题讨论】:

  • 现在你可以像这样比较两个日期:calendar1.compareTo(calendar2) 而不是 return -1:passed day --- 0 : current day --- 1 : next day

标签: java android date


【解决方案1】:

使用 compareTo 方法 ..返回整数值 .if 返回当前日期前几天的 -ve 否则返回当前日期后几天的 +ve

【讨论】:

  • 请先看这个how-to-answer这个问题之前回答过,显然,你可以在这里添加你的答案。但是在回答之前,您需要了解一些要点。首先,不要添加以前使用相同代码或建议添加的答案。其次,如果用户已经非常具体地询问了问题以及他需要解决什么问题,请不要添加过于复杂的答案。第三,如果您想对答案或问题提出任何建议,可以添加评论。
  • 这个答案是新的,之前没有发过,所以没有问题
【解决方案2】:

如果比较应该只涉及年、月和日,那么您可以使用此方法检查c1是否在c2之前。丑陋,但有效。

public static boolean before(Calendar c1, Calendar c2){
        int c1Year = c1.get(Calendar.YEAR);
        int c1Month = c1.get(Calendar.MONTH);
        int c1Day = c1.get(Calendar.DAY_OF_MONTH);

        int c2Year = c2.get(Calendar.YEAR);
        int c2Month = c2.get(Calendar.MONTH);
        int c2Day = c2.get(Calendar.DAY_OF_MONTH);

        if(c1Year<c2Year){
            return true;
        }else if (c1Year>c2Year){
            return false;
        }else{
            if(c1Month>c2Month){
                return false;
            }else if(c1Month<c2Month){
                return true;
            }else{
                return c1Day<c2Day;                        
            }
        }
    }

【讨论】:

    【解决方案3】:

    将它们更改为以毫秒为单位的时间并进行比较:

     Calendar c = Calendar.getInstance();
        c.set(Calendar.MONTH, Calendar.MARCH);
        c.set(Calendar.DAY_OF_MONTH, 3);
     long time2=   c.getTimeInMillis();
     c.set(Calendar.MONTH, Calendar.AUGUST);
     c.set(Calendar.DAY_OF_MONTH, 8);   
     long time3=   c.getTimeInMillis();
     if(time>time2){
         //Logic
         if(time>time3){
             //Logic
         }
     }
    

    【讨论】:

      【解决方案4】:

      有一些非常重要的事情我花了一段时间才弄清楚,如果您正在寻找以下任何问题的答案,这对您来说非常有帮助:

      为什么我的日期显示不正确? 为什么即使我手动设置时间它也显示不正确? 为什么月份和年份显示的比我设置的少一天?

      由于某种原因,Java 像数组一样对月份值进行排序,我的意思是对于 Java,1 月是 0,12 月是 11。如果将 12 月设置为 12 月,将年份设置为 2012 年,那么一年也会发生同样的情况,然后尝试做一个月份和年份的“system.out.println”,它将显示我的月份为一月,年份为2013!

      那你该怎么办?

      Calendar cal = new GregorianCalendar();
      cal.set(2012, 11, 26); // the date I want to input is 26/12/2012 (for Java, 11 is December!)
      

      现在获取该日期以在屏幕上看到它的正确方法是什么?

      如果您尝试“system.out.println of yourCalendar.DATE、yourCalendar.MONTH 和 yourCalendar.YEAR”,则不会显示正确的日期!!!!

      如果要显示日期,您需要执行以下操作:

      System.out.println (calact.get (calact.DATE)); 
      // displays day
      System.out.println (calact.get (calact.MONTH)+1); 
      //add 1 remember it saves values from 0-11
      System.out.println (calact.get (calact.YEAR));  
      // displays year
      

      现在,如果您正在处理代表日期的字符串,或者...... 如果您需要比较范围之间的日期,假设您需要知道日期“A”是否会在接下来的 10 天内发生......这......这是......为......你! !

      就我而言,我正在使用格式为“15/07/2012”的字符串,我需要知道该日期是否会在接下来的 10 天内发生,因此我必须执行以下操作:

      1 获取该字符串日期并将其转换为日历(此处使用 StringTokenizer)

      这很简单

      StringTokenizer tokens=new StringTokenizer(myDateAsString, "/");
      

      执行 nextToken 并在返回日期之前,将其解析为整数并返回。 在返回减法 1 之前记住一个月。

      我将发布你创建其他两个的第一个代码:

      public int getMeD(String fecha){
      
          int miDia = 0;
          String tmd = "0";
      
          StringTokenizer tokens=new StringTokenizer(fecha, "/");
          tmd = tokens.nextToken();
      
          miDia = Integer.parseInt(tmd);
      
          return miDia;
      }
      

      2 然后创建日历

          Calendar cal = new GregorianCalendar(); // calendar
          String myDateAsString= "15/07/2012";    // my Date As String
          int MYcald = getMeD(myDateAsString); // returns integer
          int MYcalm = getMeM(myDateAsString); // returns integer
          int MYcaly = getMeY(myDateAsString); // returns integer
      
                  cal.set(MYcaly, MYcalm, MYcald);
      

      3 获取我当前的日期(今天)

          Calendar curr = new GregorianCalendar(); // current cal
          calact.setTimeInMillis(System.currentTimeMillis());
      

      4 创建时间日历以进入未来 10 天

      Calendar caltemp = new GregorianCalendar(); // temp cal
      caltemp.setTimeInMillis(System.currentTimeMillis());
      caltemp.add(calact.DAY_OF_MONTH, 10); // we move into the future
      

      5 比较所有 3 个日历

      这里基本上你问我得到的日期是否肯定在未来发生并且 (&&) 如果给定的日期也小于未来 10 天的日期,那么请告诉我“事件将确保在接下来的 10 天内到位!!”否则给我看: “事件将不会在接下来的 10 天内举行”。

          if((cal.getTimeInMillis() > curr.getTimeInMillis()) &&        (cal.getTimeInMillis()< curr.getTimeInMillis()))
          { System.out.println ("EVENT WILL TAKE PLACE FOR SURE WITHIN THE NEXT 10 DAYS!!");}
          else
          { System.out.println ("EVENT WILL *NOT* TAKE PLACE WITHIN THE NEXT 10 DAYS");}
      

      好的,希望对大家有所帮助。给你们一个大大的拥抱,祝你们的项目好运!

      和平。 YOAV。

      【讨论】:

      • 欢迎来到 Stack Overflow。欢迎您的热情(如果不是您喜欢大写字母)。但是您的帖子与所提出的问题只有一点点联系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2011-09-14
      • 2018-02-03
      • 2021-09-20
      相关资源
      最近更新 更多