2016-12-16 9 views
1

私は新しくスクールの学生を勉強しています!次の週の取得方法Javaのユーザー入力日より月曜日

私のシナリオは: *ユーザーからの入力日付を取得 *翌週の月曜日の日付をo/pとしてユーザーに表示してください!例えば

、入力日:15/12/2016 出力:19/12/2016(月曜日)

私はフォーラムを検索しましたし、私が上で実行するために、次のコードを持っています。

GregorianCalendar date1 = new GregorianCalendar(2016, 12, 12); 

     while(date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) 
      date1.add(Calendar.DATE, 1); 

     System.out.println(date1.getTime()); 

しかし、それは月1月16日00:00:00 GMT + 05などのp/oを私に与えます:2016年12月12日I/Pのために、30 2017。

o/pを19/12/2016として取得したいと考えています。親切にも、私はテクノロジーの天才を助けてくれます!

+1

新しいJava 8タイムクラスを使用できますか? [公式の日付時間のチュートリアル](http://docs.oracle.com/javase/tutorial/datetime/index.html)を参照してください。 'GregorianCalendar'は動作させることができますが、これは古いものです。新しいクラスは、このようなタスクでは特に働きやすくなります。 –

答えて

0

感謝を! 1時間のコーディングの後、私は以下のコードでそれを達成しました!親切にコードを通過し、私のパスのどこかにいる場合は私を親密にしてください!

GregorianCalendar date1 = new GregorianCalendar(year, month-1, date); 
     SimpleDateFormat dateOnly = new SimpleDateFormat("dd/MM/yyyy"); 
//  System.out.println("Formated date"+dateOnly.format(date1.getTime())); 
     String day1="",day2; 

    while(date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) 
     date1.add(Calendar.DATE, 1); 

    da1=String.valueOf(dateOnly.format(date1.getTime())); 
    System.out.println("Start_date"+da1); 

    date1.add(Calendar.DATE, 6); 
    da2=String.valueOf(dateOnly.format(date1.getTime())); 
    System.out.println("End_date"+da2); 
0

あなたはのGregorianCalendarのJavaDocの中で見てみる場合は、あなたが使用コンストラクタのパラメータは、1月のためから始まるので、12月のを持っていることを見ることができます。

その後、適切な結果である16/01/2017を意味の1月としてを解釈します。

がGregorianCalendarの気を取るあなたの日付をフォーマットする

1

使用SimpleDateFormatはそれがうまくGregorianCalendar(2016, 12, 12)

2017年12月1日

を意味することを示して0

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY"); 
System.out.println(sdf.format(date1.getTime())); 

から開始し、それをmounth

+0

こんにちはデイド、助けてくれてありがとう:) date1は私がGregorianCalendarのために使ったオブジェクトですか? – Kanagalingam

+0

こんにちは、はい、あなたの** GregorianCalendar ** – mustafa918

1

コードが正しく動作しています。あなたは0 - 11(1月 - 12月)として月を取らなければなりません。変更されたコード以下試してください:

GregorianCalendar date1 = new GregorianCalendar(2016, 11, 13); // here month start for 0 to 11 (Jan to Dec.) 

    while(date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) 
     date1.add(Calendar.DATE, 1); 

    System.out.println(date1.getTime());     

おかげで...

1

をあなたのコードを簡素化することができますすべてのあなたの助けを

GregorianCalendar date1 = new GregorianCalendar(2016, 11, 16); 


date1.add(Calendar.DATE, 7);      //Move to next weed 
date1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //Set the day to Monday of current week 
+0

私はあなたのコードを試してみました!それは16/11/2016の日付で正常に動作します。しかし、もし私が(2016,12,16)のように日付を変更すると、月1月23日00:00:00 GMT + 05:30 2017 ...としてo/pが表示され、o/pは12月19日でなければならない(2016年、12月16日)na ... – Kanagalingam

+1

@カナアリンガム(2016年、12月16日)は、2016年の13番目の月(13日に再び読まれる)です。月は0から11までの値でなければなりません。それは変だけど、それは古いDate APIの仕組みです:0から始まる月です。また、Sissyと呼んではいけません。 –

+0

あなたの返事をありがとうマーガレット・ブルーム:P今私はコンセプトを理解しました! – Kanagalingam

1

TL; DR

LocalDate.parse( 
    "15/12/2016" , 
    DateTimeFormatter.ofPattern("dd/MM/uuuu") 
).with(
    TemporalAdjusters.next(DayOfWeek.MONDAY) 
) 

java.time

あなたはjava.timeクラスに取って代わら面倒な古い日付時刻クラス、今の遺産を、使用しています。

LocalDate

LocalDateクラスは、時間日の時間帯なしなし日付専用の値を表しています。

LocalDate ld = LocalDate.parse("15/12/2016" , DateTimeFormatter.ofPattern("dd/MM/uuuu")); 

java.timeクラスはimmutable objectsを使用しています。したがって、既存のオブジェクトの値を変更(「変更」)するのではなく、元の値に基づいて新しいオブジェクトをインスタンス化します。これを行う1つの方法は、TemporalAdjusterの実装です。

LocalDate nextMonday = ld.with(TemporalAdjusters.next(DayOfWeek.MONDAY)) ; 

クラスは何度も議論されています。したがって、詳細情報を得るためにスタックオーバーフローを検索してください。 java.timeについて


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

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

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

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

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

これらの古いクラスはまだ標準でありレガシーではありませんが、Androidの開発者には使用しないようにアドバイスしたい場合は、お気に入りのThreetenABPではなく、Oracle Java-8バージョンを強調する必要があります。標準。ちなみに、Threeten-ExtraのようなサードパーティのライブラリをAndroidで実行することはできないと推薦しても、それは役に立たず、全く話題にはなりません。 –

関連する問題