Могу ли я получить количество дней с 1 января 1900 года для данной даты, используя только API java. *? - PullRequest
2 голосов
/ 15 января 2011

Таблицы (MS Excel, Google Apps) представляют даты в виде количества целых дней с 1 января 1900 года (возможно, предостережение 29 февраля в случае Excel ).Итак, это 365 дней, за исключением високосных лет.Но это уже слишком большая арифметика.

Предположительно, 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), необходимо учитывать високосные годы.В этих условиях 31536000 секунд - это 365 дней.3 из 4 лет, которые получают меня с 1 января по 1 января.Но на 4-м году я получаю только с 1 января по 31 декабря, получая 1-дневную ошибку каждые 4 года!

У меня уже есть решение для получения количества календарных дней.Это тривиальный фрагмент кода для перехода на Java, и он получает желаемый ответ (хотя я не понимаю его и поэтому не доверяю ему).Этот вопрос специально задает (теперь даже больше после редактирования), могу ли я вообще избежать этих вычислений и перенести их в «доверенную» библиотеку в JDK.До сих пор я пришел к выводу «нет».

Ответы [ 4 ]

1 голос
/ 15 января 2011

Это довольно тупой и неэффективный способ достижения вашей цели, но его можно использовать для проверки других методов

    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);
}
0 голосов
/ 26 января 2011

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

long lTime1 = myGcalEarlier.getTimeInMillis (); long lTime2 = myGcalLater.getTimeInMillis ();

длинные дни = (lTime2 - lTime1) / (24 * 60 * 60 * 1000);

0 голосов
/ 15 января 2011

вы можете использовать myGcalEarlier.getTimeInMillis() и myGcalLater.getTimeInMillis(), а затем преобразовать в дни, разделив их на миллисекунды в количестве дней.24 * 60 * 60 * 1000.и ваш первый набор вызовов неверен.

set(int year, int month, int date)

месяц равен 0 на 0 января

0 голосов
/ 15 января 2011

Немного знаний о специфике API даты в Java здесь, но если вы можете найти метод, который дает вам метки времени Unix, вы сможете понять это - метка времени Unix - это количество секунд с начала эпохи (1 января,1970, 0:00:00 UTC), поэтому все, что вам нужно сделать, это найти метки времени Unix для обеих дат, вычесть, разделить на 86400 (количество секунд в дне) и отрезать дробную часть.1002 * То же самое можно сделать для любого другого линейного представления временных точек - все, что вам нужно знать, это как преобразовать в это линейное представление и сколько единиц в день.

...