2013-03-10 18 views
6
私は何を探していますと、昨日から始まって、Javaで曜日の配列を作成して、そのような

のJava - 現在の週の日の名前の配列を取得します

String daysWeek[] = { "Yesterday", "Today", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; 
として6日間の時間まで行くことです

配列の最初の2つの要素は、「昨日と今日」に戻ってきます。今日言うcurrentDay = 3が火曜日の場合は0、すなわちでdaysList開始の配列は、これはdaysList[2]になりますので、daysList[currentDay]上記に

currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 

String daysList[] = {"Sunday", "Monday", "Tuesday", "Wednesday", 
      "Thursday", "Friday", "Saturday"}; 

String daysWeek[] = {"Yesterday", "Today", daysList[currentDay], daysList[currentDay+1], ...}; 

にメモを使って、簡単な作業は明日戻りますように、最初にこの時

が見えました。

しかし私の問題は、todayDayが今日土曜日であることを意味する7なら、明日であるcurrentDay+1は存在しない配列の8番目の要素になります。

今日の水曜日またはそれ以降は、currentDay + x > 7の場合はcurrentDayを1に戻します。

このすべてはdaysWeek[]配列を返すgetDaysList(currentDay)と呼ばれる1つの方法で行われます。

+1

WCharginの答えは正しいです。私はあなたがなぜそれをしたいのかを知りたいだけです。配列を使用すると、オブジェクト指向の設計が悪いことがよくあります。おそらくあなたのコードはリファクタリングされるかもしれません。平日に配列を格納するという目標を説明すると、もっと良い解決策が見つかるかもしれません(またはあなたの解決策が最高であることを理解してください) – Martin

答えて

7

ここで使用する関数は、モジュロ%)演算子です。

基本的に、モジュロ演算子は、除算の残りの部分を取ります。これはまさにあなたが望むものです。 (?これはその残りの部分である "9月2日には" 4.5なかった時に戻って4年生では覚えているが、4余り1。)

をだからではなく、あるの:

days[currentDay + x] 

用途:

モジュロ演算子で返される値に
days[(currentDay + x) % 7] 

クイック例:あなたは剰余演算子を使用することができます

0 % 7 = 0 (0/7 = 0 R0) 
1 % 7 = 1 (1/7 = 0 R1) 
6 % 7 = 6 (6/7 = 0 R6) 
7 % 7 = 0 (7/7 = 1 R0) 
8 % 7 = 1 (8/7 = 1 R1) 
15 % 7 = 1 (15/7 = 2 R1) 
+0

ありがとう、この記法について忘れました。 – ChrisAF

1

%):

6 % 7 == 6 
7 % 7 == 0 
8 % 7 == 1 
1

TL; DR

LocalDate.now(ZoneId.of("Pacific/Auckland")) 
     .plusDays(5) 
     .getDayOfWeek() 
     .getDisplayName(TextStyle.FULL , Locale.US) 

詳細

曜日に関係する配列インデックスのアイデアを離れてあなたの心を取得します。

一般的に、単純な配列ではなくオブジェクトを収集するためにmodern collection objectを使用することをお勧めします。

また、面倒なCalendarクラスを避けてください。今度はjava.timeクラスに取って代わりました。

最初に現在の日付を取得します。 LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはISTのような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

我々は昨日のための結果はその日付を計算するyesterdayそれほど必要ではありません知っています。日付が必要な場合は、LocalDate::minusDaysに電話してください。

LocalDateには、DayOfWeek列挙型オブジェクトを抽出することによって、その日の名前を尋ねることができます。そのDayOfWeekLocaleオブジェクトで指定できるits own name in any human languageを知っています。したがって、テンプレートの日時文字列の配列を追跡する必要はありません。ヒント:OOPでは、基本的な配列を使用してすべての作業を自分で行うのではなく、(a)オブジェクトをスマートにすること、または(b)ヘルパーオブジェクトの助けを必要とすることを考えてみてください。

List<String> dayNames = new ArrayList<>(7) ; // Initialize to seven days of a week. 
dayNames.add("yesterday") ; 
dayNames.add("today") ; 
for(int i = 1 ; i <= 5 ; i ++) { 
    LocalDate ld = today.plusDays(i) ; 
    String dayName = ld.getDayOfWeek().getDisplayName(TextStyle.FULL , Locale.US) ; 
    dayNames.add(dayName) ; // Add each of the five days remaining in a week. 
} 

お試しくださいcode live in IdeOne.comです。

[昨日、今日、火曜日、水曜日、木曜日、金曜日、土曜日]


java.timeについて

java.timeフレームワークは、Java 8の中に、後に構築されています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6Java SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題