【问题标题】:Find number of days, weeks, months and year between two milliseconds.查找两毫秒之间的天数、周数、月数和年数。
【发布时间】:2013-12-10 06:08:10
【问题描述】:

我需要在我的自定义日历中设置事件,这些事件将根据选定的时间段重复,即每天、每周、每月或每年。我有以毫秒为单位的开始和结束日期。

问题:

是否有任何日历或日期 API,我们可以从中计算两毫秒之间的天数、周数、月数和年数。我使用了 Joda 库,但没有得到任何合适的方法。

我应该为此编写自定义代码吗? :-(

【问题讨论】:

  • 请澄清您的问题。你谈到三个不同的问题。您想在一天、一周、一个月等中确定未来的日期。但是您谈论的是计算两点之间的时间跨度。 “以毫秒为单位的开始和结束日期”是什么意思?你的意思是每一个都表示为一个纪元的毫秒数吗?如果是这样,什么时代 - 1970 年初的 Unix 风格?
  • @BasilBourque 我有两个毫秒格式的日期(Unix 风格),一个是开始日期(例如:任何事件的开始),第二个是结束日期(例如:任何事件的结束),最后我想确定他们之间未来的日期。
  • 我还是无法理解你的问题。什么是一对日期之间的“未来日期”?无论如何,[Joda-Time] 几乎可以肯定是要走的路。一个好的起点可能是研究问题Joda-Time: what's the difference between Period, Interval and Duration?。并尝试用简单的商务英语术语明确你需要什么——你将如何向非程序员业务人员解释这个问题?
  • @BasilBourque 好的!问题很简单......我想要两个时间戳之间的天数、月数、周数和年数?时间戳之间的差距可能因天、月等而异。
  • @AkAkhileshMani 你的意思是说一个小女孩六岁零四个月零三天?时间跨度的描述?那就看看我的回答吧。

标签: android android-calendar android-date


【解决方案1】:

你可以使用

public String getElapsedDaysText(Calendar c1, Calendar c2)
{
    String elapsedDaysText = null;
    try
    {
        long milliSeconds1 = c1.getTimeInMillis();
        long milliSeconds2 = c2.getTimeInMillis();
        long periodSeconds = (milliSeconds2 - milliSeconds1) / 1000;
        long elapsedDays = periodSeconds / 60 / 60 / 24;
        elapsedDaysText = String.format("%d days", elapsedDays);
    }
    catch (Exception e)
    {
        Logger.LogError(e);
    }
    return elapsedDaysText;
}

其中c1 是当前日期,c2 是未来某个日期。如果要计算过去日期,c2 是过去日期,c1 是现在日期。

您可以使用相同的方法通过一些更改来查找周、月和年。

【讨论】:

    【解决方案2】:

    如果你的意思是说一个小女孩是:

    6岁4个月零3天

    ……时间跨度的描述?

    那么您需要 Joda-Time 2.3 中的 PeriodPeriodFormatterPeriodFormatterBuilder 类。

    查看问题,Joda-Time: what's the difference between Period, Interval and Duration?

    在 Joda-Time 文档中查看此 discussion on Period

    来自 Joda-Time 的文档……

    例如,打印年份和月份的格式化程序,如“15 年零 8 个月”,可以如下构造:

    PeriodFormatter yearsAndMonths = new PeriodFormatterBuilder()
     .printZeroAlways()
     .appendYears()
     .appendSuffix(" year", " years")
     .appendSeparator(" and ")
     .printZeroRarelyLast()
     .appendMonths()
     .appendSuffix(" month", " months")
     .toFormatter();
    

    【讨论】:

      【解决方案3】:

      如果您有以毫秒为单位的日期,那么下面提供的 java 类就是您的答案,可以满足您的所有需求。

      http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

      另外,如果您有两个日期范围,那么您所能做的就是计算以毫秒为单位的差异,然后将它们除以计算秒,然后计算小时、日和月等等,以满足您的所有需求。

      【讨论】:

        【解决方案4】:

        我认为你可以使用这个(java.util.Date)

        Date date=new Date(millis);
        

        【讨论】:

          【解决方案5】:
          Calendar c1, c2;
          
          
          long ms1= c1.getTimeInMillis();
          long ms2= c2.getTimeInMillis();
          long totalsec = (ms2- ms1) / 1000;
          
          int days = (int) ((totalsec/ (1000*60*60*24)) % 7);
          int weeks = (int) (totalsec/ (1000*60*60*24*7));
          int months = weeks/30;
          int years = months/365;
          

          【讨论】:

            【解决方案6】:

            CalDroid 可能会解决您的问题。你可以找到它的源代码和示例here

            public static long getDayDiff(long startDay, long endDay) {
            long diff = endDay - startDay;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            return diffDays;
            }
            

            所以 diffWeek = diffDays/7; 然后是月、年。

            【讨论】:

              【解决方案7】:

              我为此任务创建了一个自定义代码。在这里,您将找到在任意两个时间戳之间设置的事件的未来日期(开始时间戳应该小于或等于结束时间戳)。您必须固定事件持续时间,例如每周、每年、每天或每月。

                  public class EventManipulationClass {
              
                 public EventManipulationClass(){
                      for (int i = 0; i < MyPetApplication.instance.eventDatasArrayList.size(); i++) {
                          String repType=MyPetApplication.instance.eventDatasArrayList.get(i).getRepeat();
                          if (repType.equals("Daily")) {
                              computeDaily(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                          } else if (repType.equals("Yearly")) {
                              computeYearly(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                          } else if (repType.equals("Monthly")) {
                              computeMonthly(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                          } else if (repType.equals("Weekly")) {
                              computeWeekely(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                          } else {
                              <none>
                          }
                      }
                  }
              
                 private String doubleDigitDate(int date){
                     String tempDate;
                      if(date<10){
                          tempDate="0"+date;
                      }else {
                          tempDate=""+date;
                      }
                      return tempDate;
                 }
              
                  private void computeWeekely(long starT,long endT){
                      int sMonth;
                      int sYear;
                      int sDay;
              
                      int eMonth;
                      int eYear;
                      int eDay;
              
                      int diffMonth;
                      int diffYear;
              
                      Calendar startCalendar=GregorianCalendar.getInstance();
                      startCalendar.setTimeInMillis(starT);
                      sMonth=startCalendar.get(Calendar.MONTH)+1;
                      sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
                      sYear=startCalendar.get(Calendar.YEAR);
              
                      Calendar endCalendar=GregorianCalendar.getInstance();
                      endCalendar.setTimeInMillis(endT);
                      eMonth=endCalendar.get(Calendar.MONTH)+1;
                      eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
                      eYear=endCalendar.get(Calendar.YEAR);
              
                      diffMonth=eMonth-sMonth;
                      diffYear=eYear-sYear;
              
                      if(diffMonth==0 && diffYear==0){
                          int eventDate = sDay;
                          int totalDaysInMonth = getNumberOfDaysInMonth(sMonth, (sYear % 400 == 0) ? true:false);
                          boolean isLastDay = false;
                          for (int x2 = 0; x2 <= 5; x2++) {
                              if (eventDate <= totalDaysInMonth && eventDate <= eDay) {
                                  System.out.println("same month same year 1=====> "+ sMonth+ "-" + eventDate + "-"+ sYear);
                                  if(eventDate==eDay){
                                          isLastDay=true;
                                          break;
                                      } else {
                                          eventDate=eventDate+7;
                                          continue;                               
                                      }
                               }else { 
                                   if (isLastDay) {
                                          break;
                                      }else{
                                          System.out.println("same month same year 2 =====> "+ eMonth+ "-" + eDay + "-"+ eYear);
                                          break;
                                      }   
                               }
                              }
                      } else if(diffMonth!=0 && diffYear==0){
                      int eventDate = 0;
                      int totalDaysInMonth = 0;
                      @SuppressWarnings("unused")
                      boolean isLastDay = false;
                      for (int x = sMonth; x <= eMonth; x++) {
                          if(x==sMonth){
                                eventDate=sDay;
                          }else{
                                eventDate=Math.abs(eventDate-totalDaysInMonth);
                          }
                          totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                          for (int x2 = 0; x2 <= 5; x2++) {
                           if (eventDate <= totalDaysInMonth) {
                               if(x==eMonth && eventDate >eDay){
                                  System.out.println("Diff month same year 1 =====> "+ x+ "-" + eDay + "-"+ sYear);
                                  isLastDay=true;
                                  break;
                              }else {
                                  System.out.println("Diff month same year 2 =====> "+ x+ "-" + eventDate + "-"+ sYear);
                                  if(x==eMonth && eventDate ==eDay){
                                          isLastDay=true;
                                          break;
                                      } else {
                                          eventDate=eventDate+7;
                                          continue;                               
                                  }
                              }
                          } else {
                              break;
                          }
                      }
                      }
                  }else  { 
                          int numberOfYear = Math.abs(sYear - eYear) ;
                          Integer yearsArray[] = new Integer[numberOfYear+1];
                          int eventDate = 0;
                          for (int i = 0; i <= numberOfYear; i++) {
                              yearsArray[i] = sYear + i;
                          }
                          int totalDaysInMonth = 0;
                          for (int j = 0; j < yearsArray.length ; j++) {
                              if (j == 0) {
                                  for (int x = sMonth; x <= 12; x++) {
                                      if(x==sMonth){
                                            eventDate=sDay;
                                      }else{
                                            eventDate=Math.abs(eventDate-totalDaysInMonth);
                                      }
                                      totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                      for (int x2 = 0; x2 <= 5; x2++) {
                                          if (eventDate <= totalDaysInMonth) {
                                              System.out.println("Diff month Diff year 1=====> "+ x+ "-" + eventDate + "-"+ sYear);
                                              eventDate=eventDate+7;
                                          } else {
                                              break;
                                          }
                                      }
                                  }
                              } else if (j < yearsArray.length-1) {
                                  for (int x = 1; x <= 12; x++) {
                                      eventDate=Math.abs(eventDate-totalDaysInMonth);
                                      totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
              
                                      for (int x2 = 0; x2 <= 5; x2++) {
                                          if (eventDate <= totalDaysInMonth) {
                                              System.out.println("Diff month Diff year 2=====> "+ x+ "-" + eventDate + "-"+ yearsArray[j]);
                                              eventDate=eventDate+7;
                                          } else {
                                              break;
                                          }
                                      }
                                  }
                              } else {
                                  for (int x = 1; x <= eMonth; x++) {
                                      eventDate=Math.abs(eventDate-totalDaysInMonth);
                                      totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
              
                                      for (int x2 = 0; x2 <= 5; x2++) {
                                          if (eventDate <= totalDaysInMonth) {
                                              if(x==eMonth && eventDate >eDay){
                                                  System.out.println("Diff month Diff year 3 1=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                                  break;
                                              }else {
                                                  System.out.println("Diff month Diff year 3 2=====> "+ x+ "-" + eventDate + "-"+ yearsArray[j]);
              
                                                  if(x==eMonth && eventDate >eDay){
                                                      System.out.println("Diff month Diff year 3 1.2=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                                  break;
                                                  } else {
                                                      eventDate=eventDate+7;
                                                      continue;
                                                  }
                                              }
                                          } else {
                                              if(x==eMonth && eventDate >eDay){
                                                  System.out.println("Diff month Diff year 3 1.2=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                                  break;
                                                  }
                                              break;
                                          }
                                      }
                                  }
                              }
                          }
                      }
                  }
              
                  private void computeDaily(long starT,long endT){
                      int sMonth;
                      int sYear;
                      int sDay;
              
                      int eMonth;
                      int eYear;
                      int eDay;
              
                      int diffMonth;
                      int diffYear;
              
                      Calendar startCalendar=GregorianCalendar.getInstance();
                      startCalendar.setTimeInMillis(starT);
                      sMonth=startCalendar.get(Calendar.MONTH)+1;
                      sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
                      sYear=startCalendar.get(Calendar.YEAR);
              
                      Calendar endCalendar=GregorianCalendar.getInstance();
                      endCalendar.setTimeInMillis(endT);
                      eMonth=endCalendar.get(Calendar.MONTH)+1;
                      eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
                      eYear=endCalendar.get(Calendar.YEAR);
              
                      diffMonth=eMonth-sMonth;
                      diffYear=eYear-sYear;
              
                      if(diffMonth==0 && diffYear==0){
                          for (int i = sDay; i <= eDay; i++) {
                              System.out.println("same month same year 1=====> "+ sMonth+ "-" + i + "-"+ sYear);
                          }
                          }
                      else if (diffMonth != 0 && diffYear == 0) {
                          int totalDaysInMonth = 0;
                          for (int x = sMonth; x <= eMonth; x++) {
                              if(x==sMonth){
                                  totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                  for (int i = sDay; i <= totalDaysInMonth; i++) {
                                      System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                  }
                              }else if(x==eMonth){
                                  for (int i = 1; i <= eDay; i++) {
                                      System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                  }
                              }
                              else {
                                  totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                  for (int i = 1; i <= totalDaysInMonth; i++) {
                                      System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                  }
                              }
                          }
              
                      }else  { 
                          int numberOfYear = Math.abs(sYear - eYear) ;
                          Integer yearsArray[] = new Integer[numberOfYear+1];
                          for (int i = 0; i <= numberOfYear; i++) {
                              yearsArray[i] = sYear + i;
                          }
                          int totalDaysInMonth = 0;
                          for (int j = 0; j < yearsArray.length ; j++) {
                              System.out.println(">>>>>>>>> J" +j+">>>>>>>>"+yearsArray.length);
                              if (j == 0) {
                                  for (int x = sMonth; x <= 12; x++) {
                                      if(x == sMonth){
                                          totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                          for (int i = sDay; i <= totalDaysInMonth; i++) {
                                              System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                          }
                                      }else {
                                          totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                          for (int i = 1; i <= totalDaysInMonth; i++) {
                                              System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                          }
                                      }
                                  }
                              } else if (j < yearsArray.length-1) {
                                  for (int x = 1; x <= 12; x++) {
                                      totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                      for (int i = 1; i <= totalDaysInMonth; i++) {
                                          System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                                      }
                                  }
                              } else {
                                  for (int x = 1; x <= eMonth; x++) {
                                      totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                      if(x==eMonth){
                                          for (int i = 1; i <= eDay; i++) {
                                              System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                                          }
                                      }else {
                                          for (int i = 1; i <= totalDaysInMonth; i++) {
                                              System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                                          }
                                      }
                                  }
                              }
                          }
                      }
                  }
              
                  private void computeMonthly(long starT,long endT){
                      int sMonth;
                      int sYear;
                      int sDay;
              
                      int eMonth;
                      int eYear;
              
                      int diffMonth;
                      int diffYear;
              
                      Calendar startCalendar=GregorianCalendar.getInstance();
                      startCalendar.setTimeInMillis(starT);
                      sMonth=startCalendar.get(Calendar.MONTH)+1;
                      sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
                      sYear=startCalendar.get(Calendar.YEAR);
              
                      Calendar endCalendar=GregorianCalendar.getInstance();
                      endCalendar.setTimeInMillis(endT);
                      eMonth=endCalendar.get(Calendar.MONTH)+1;
                      eYear=endCalendar.get(Calendar.YEAR);
              
                      diffMonth=eMonth-sMonth;
                      diffYear=eYear-sYear;
              
                      if(diffMonth==0 && diffYear==0){
                          System.out.println("Same month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
                      }else if(diffMonth!=0 && diffYear==0){
                          for (int x = sMonth; x <= 12; x++) {
                              System.out.println("Diff month same year =====> "+x + "-" + sDay + "-"+ sYear);
                          }
                      }else  { 
                          int numberOfYear = Math.abs(sYear - eYear) ;
                          Integer yearsArray[] = new Integer[numberOfYear+1];
                          for (int i = 0; i <= numberOfYear; i++) {
                              yearsArray[i] = sYear + i;
                          }
                          for (int j = 0; j < yearsArray.length ; j++) {
                           if (j == 0) {
                                  for (int x = sMonth; x <= 12; x++) {
                                      System.out.println("Diff month Diff year 1=====> "+ x+ "-" + sDay + "-"+ sYear);
                                  }
                              } else if (j < yearsArray.length-1) {
                                  for (int x = 1; x <= 12; x++) {
                                      System.out.println("Diff month Diff year 2=====> "+x + "-" + sDay + "-" + yearsArray[j]);
                                  }
                              } else {
                                  for (int x = 1; x <= eMonth; x++) {
                                      System.out.println("Diff month Diff year 3=====> "+x + "-" + sDay + "-" + yearsArray[j]);
                                  }
                              }
                          }
                      }
                  }
              
                  private void computeYearly(long starT,long endT){
                      int sMonth;
                      int sYear;
                      int sDay;
              
                      int eMonth;
                      int eYear;
                      int eDay;
              
                      int diffMonth;
                      int diffYear;
              
                      Calendar startCalendar=GregorianCalendar.getInstance();
                      startCalendar.setTimeInMillis(starT);
                      sMonth=startCalendar.get(Calendar.MONTH)+1;
                      sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
                      sYear=startCalendar.get(Calendar.YEAR);
              
                      Calendar endCalendar=GregorianCalendar.getInstance();
                      endCalendar.setTimeInMillis(endT);
                      eMonth=endCalendar.get(Calendar.MONTH)+1;
                      eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
                      eYear=endCalendar.get(Calendar.YEAR);
              
                      diffMonth=eMonth-sMonth;
                      diffYear=eYear-sYear;
              
                      if(diffMonth==0 && diffYear==0){
                          System.out.println("Same month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
                      }else if(diffMonth!=0 && diffYear==0){
                          System.out.println("diff month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
                      }else  { 
                          int numberOfYear = Math.abs(sYear - eYear) ;
                          Integer yearsArray[] = new Integer[numberOfYear+1];
                          for (int i = 0; i <= numberOfYear; i++) {
                              yearsArray[i] = sYear + i;
                          }
                          for (int j = 0; j < yearsArray.length ; j++) {
                              if (j == 0) {
                                  System.out.println("diff month diff year=====> "+sMonth + "-" + sDay + "-"+ sYear);
                              } else if (j < yearsArray.length-1) {
                                  System.out.println("diff month diff year=====> "+sMonth + "-" + sDay + "-"+ yearsArray[j]);
                              } else {
                                  System.out.println("diff month diff year=====> "+sMonth + "-" + eDay + "-"+  yearsArray[j]);
                              }
                          }
                      }
                  }
              
                  private int getNumberOfDaysInMonth(int currentMonth,boolean isLeapYear){
                      int days = 0;
              
                      if (currentMonth==1){
                          days=31;
                      }else if(currentMonth==2){
                          if(isLeapYear)
                              days=29;
                          else
                              days=28;
                      }else if(currentMonth==3){
                          days=31;
                      }else if(currentMonth==4){
                          days=30;    
                      }else if(currentMonth==5){
                          days=31;
                      }else if(currentMonth==6){
                          days=30;
                      }else if(currentMonth==7){
                          days=31;
                      }else if(currentMonth==8){
                          days=31;
                      }else if(currentMonth==9){
                          days=30;
                      }else if(currentMonth==10){
                          days=31;
                      }else if(currentMonth==11){
                          days=30;
                      }else if(currentMonth==12){
                          days=31;
                      }
                      return days;
                  }
              }
              

              【讨论】:

                【解决方案8】:

                找出两毫秒之间的天数、周数、月数和年数。

                这是一个使用DateCalendarTimeUnit类的方法:

                private String getAge(long start, long end){
                
                    long milliseconds = TimeUnit.MILLISECONDS.toMillis(Math.abs(end - start));
                
                    Calendar c = Calendar.getInstance();
                    c.setTimeInMillis(milliseconds);
                    int mYear = c.get(Calendar.YEAR)-1970;
                    int mMonth = c.get(Calendar.MONTH);
                    int mDay = c.get(Calendar.DAY_OF_MONTH)-1;
                    int mWeek = (c.get(Calendar.DAY_OF_MONTH)-1)/7; 
                
                    return "The difference is " + mYear + " years, " + mMonth + " months, " + mDay + " days. " + mWeek + " Weeks.";
                }
                

                这是一个调用函数的例子:

                System.out.println(getAge2(1538110800000L ,  479628000000L));
                

                输出:

                The difference is 33 years, 6 months, 16 days. 2 Weeks.
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-05
                  • 2012-07-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多