0

ミリ秒または java.sql.Timestamp で 2 つの日付があるとします。

1342162320 <->  Fri Jul 13 2012 09:52:00 GMT+0300 (FLE Daylight Time)
1343162320 <-> Tue Jul 24 2012 23:38:40 GMT+0300 (FLE Daylight Time)

これら2つの日付を提供するとしましょう。必要なものは次のとおりです。

7 月 13 日 09:52 から 7 月 24 日 23:58 までの時間が週末または大きな祝日の場合は int を返し、その場合は何日かを返します。

すべての日付を調べて、土曜日か日曜日かを確認することを考えましたが、もっと賢い API はありますか?

Joda ライブラリも調べましたが、具体的にこれらのメソッドはなく、単純化された JDK のメソッドがいくつかあります。Joda には休日の認識がありません。

4

3 に答える 3

1

http://www.calendarlabs.com/ical-calendar-holidays.phpから定義された休日カレンダーを使用できます。それらは多くの国で利用できます。その形式は MS Outlook で使用される iCal と呼ばれます。そのフォーマット用のパーサーを書くのは難しくないはずです。次に、「赤い」日付があり、定義して更新する必要はなく、毎年新しい定義をダウンロードするだけです.

Google カレンダーなどから休日を取得することもできます。

于 2012-07-13T08:05:18.277 に答える
0

はい、これは非常に簡単です。以下のコードに従ってください。

    Calendar cal = new GregorianCalendar();
    cal.setTime(date);
    //cal.setTimeInMillis(milliseconds); use this one instead if you have milliseconds. 
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    if(Calendar.SUNDAY == dayOfWeek || Calendar.SATURDAY == dayOfWeek){
        System.out.println("it is saturday or sunday")
   }

これは、その日が土曜日または日曜日であることを認識できますが、それが祝日であるかどうかを判断したい場合はどうでしょうか。例:国民の祝日、これはJDKを介して不可能である可能性があります。これは、さまざまな地域や国に非常に準拠しているため、永続的なものではありません。

于 2012-07-13T07:51:25.853 に答える
0

tl;dr

Boolean isWeekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ).contains ( Instant.ofEpochSecond( 1342162320L ).atZone( ZoneId.of( "Europe/Helsinki" ) ).getDayOfWeek() )

詳細

他の回答は正しいですが、時代遅れのレガシークラスを使用しています。代わりに java.time クラスを使用してください。

質問の週末の部分は、組み込みの Java ライブラリを使用すると簡単です。米国の土曜日と日曜日など、週末である一連の曜日を定義できます。

休日をカバーするには、何らかの外部ライブラリ、Web サービス、またはデータベースが必要です。祝日の定義は、時間の経過とともに、司法管轄区や伝統によって異なります。質問のその部分は無視します。考えられる解決策の 1 つとして、Kennet による回答を参照してください。

DayOfWeek

DayOfWeek列挙型は、週の 7 日間のそれぞれを識別します。ZonedDateTimeその についてa に問い合わせることができますDayOfWeek

最初に入力した数値を解析します。UTC での 1970 年の最初の瞬間のエポックからの秒数のように見えます。これを整数Lにするために最後の に注意してください。long

Instant instant = Instant.ofEpochSecond( 1342162320L );

タイムゾーンを適用します。

ZoneId zoneId = ZoneId.of( "Europe/Helsinki" );
ZonedDateTime zdt = instant.atZone( zoneId );

曜日が土曜日か日曜日かを尋ねて、週末をテストします。

DayOfWeek dow = zdt.getDayOfWeek();
Boolean isWeekend = ( dow.equals( DayOfWeek.SATURDAY ) || dow.equals( DayOfWeek.SUNDAY ) );

EnumSet

EnumSetを使用して、実行を高速化し、メモリ使用量を抑えることもできます。

Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

static finalアプリの実行中に定義が変更されない場合は、これを定数として宣言します。

static final Set<DayOfWeek> WEEKEND = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

オブジェクトを取得したら、それがインターフェイスDayOfWeekの実装である EnumSet に含まれているかどうかを確認しSetます。

Boolean isWeekend = WEEKEND.contains( dow.getDayOfWeek() );

java.time

java.timeフレームワークは、Java 8 以降に組み込まれています。java.util.Dateこれらのクラスは、 、.Calendar、 &などの古い面倒な日時クラスに取って代わりますjava.text.SimpleDateFormat

Joda -Timeプロジェクトは現在メンテナンス モードにあり、java.time への移行を推奨しています。

詳細については、 Oracle チュートリアルを参照してください。また、Stack Overflow で多くの例と説明を検索してください。

java.time 機能の多くは、ThreeTen-Backportで Java 6 および 7 にバックポートされ、さらにThreeTenABPでAndroidに適合されています。

ThreeTen -Extraプロジェクトは、追加のクラスで java.time を拡張します。このプロジェクトは、java.time.

于 2016-08-15T00:39:55.430 に答える