电子表格(MS Excel,Google Apps)将日期表示为自1900年1月1日以来的整天数(可能是caveat a Feb 29 odditiy in Excel's case)。好的,所以这是365天,除了leap年。但这已经太过算术了。

大概java.util.[Gregorian]Calendar知道所有这些东西。问题是,我不知道如何获取知识。

在投机的世界中,可能会:

myGcalEarlier.set(1900, Calendar.JANUARY, 1);
myGcalLater.set(new Date());

long days1 = myGcalEarlier.mysteryMethod();
long days2 = myGcalLater.mysteryMethod();

long days = days2 - days1;


可悲的是,Calendar.get(Calendar.DAYS_IN_YEAR)不满足于'mysteryMethod'-它需要一个Calendar.DAYS_EVER字段来执行我想要的操作。

是否有API可以获取以日历天表示的准确差异?

笔记

我确实想要日历天,而不是86400秒的天数。除了时区和夏令时外(感谢@Dipmedeep),需要考虑leap年。这些术语中的31536000秒等于365天。 4年中有3年使我从1月1日到1月1日。但是在第4年,它只让我从1月1日到12月31日,每4年出现1天的错误!

already have a solution for getting the number of calendar days。迁移到Java是一件微不足道的代码,并且可以得到理想的答案(尽管我不理解,因此不信任它)。这个问题是专门询问(现在在编辑后甚至更多)的问题,我是否可以完全避免进行这些计算并将其推迟到JDK中的“受信任”库中。到目前为止,我得出的结论是“不”。

最佳答案

这是实现目标的一种非常愚蠢且低效的方法,但可用于验证其他技术

    public static void main(String[] args) {
      Calendar now = Calendar.getInstance();
      //now.setTime(new Date()); // set the date you want to calculate the days for
      Calendar tmp = Calendar.getInstance();
      tmp.set(0,0,0); // init a temporary calendar.
      int days=0;
      // iterate from 1900 and check how many days are in the year, sum the days
      for (int i=1900; i < now.get(Calendar.YEAR);i++) {
          tmp.set(Calendar.YEAR, i);
          int daysForThatYear = tmp.getActualMaximum(Calendar.DAY_OF_YEAR);
          days+=daysForThatYear;
          System.out.printf("year:%4d days in the year:%3d, total days:%6d\n",i,daysForThatYear,days);
      }
      // check the number of days for the current year, and add to the total of days
      int daysThisYear = now.get(Calendar.DAY_OF_YEAR);
      days+=daysThisYear;
      System.out.printf("year:%4d days in the year:%3d, total days:%6d\n",now.get(Calendar.YEAR),daysThisYear,days);
}

09-07 22:55