2

スプレッドシート(​​MS Excel、Google Apps)は、1900年1月1日からの丸日数として日付を表します(Excelの場合は2月29日の奇妙なことに注意してください)。OK、うるう年を除いて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日です。4年のうち3年、それは私を1月1日から1月1日まで取得します。しかし、4年目には、1月1日から12月31日までしか取得できず、4年ごとに1日のエラーが発生します。

暦日数を取得するためのソリューションはすでにあります。Javaに移行するのは簡単なコードであり、目的の答えが得られます(ただし、私はそれを理解していないため、信頼できません)。この質問は、これらの計算を回避してJDKの「信頼できる」ライブラリに延期できるかどうかを具体的に尋ねています(編集後はさらにそうです)。私はこれまで「いいえ」と結論付けました。

4

4 に答える 4

1

これはあなたの目標を達成するためのかなり愚かで非効率的な方法ですが、他の技術を検証するために使用される可能性があります

    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);
}
于 2011-01-15T17:25:35.857 に答える
-1

ここでjavaの日付APIの詳細についてはほとんど知識がありませんが、Unixタイムスタンプを提供するメソッドを見つけることができれば、それを理解できるはずです-Unixタイムスタンプは、エポック(1970年1月1日、0)からの秒数です。 :00:00 UTC)なので、必要なのは、両方の日付のUnixタイムスタンプを見つけ、減算し、86400(1日の秒数)で除算して、端数部分を切り取るだけです。

時点の他の線形表現についても同じことができます。知っておく必要があるのは、その線形表現に変換する方法と、1日に何単位あるかだけです。

于 2011-01-15T11:32:28.650 に答える
-1

を使用myGcalEarlier.getTimeInMillis()myGcalLater.getTimeInMillis()てから、日数のミリ秒で割って日数に変換できます。24 * 60 * 60*1000。そしてあなたの最初のセットコールは間違っています。

set(int year, int month, int date)

1月の月は0から0に基づく0

于 2011-01-15T11:32:31.083 に答える
-1

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);

于 2011-01-26T14:52:55.107 に答える