2017-09-30 9 views
0

ユーザーが日付を選択するまで(年月日)リストを印刷するプログラムを作成する必要があります(end_dateは後でend_calに変換されます)。今日は2017-09-30 Saturdayで、ユーザー入力が2017-10-30とデート場合リストのカレンダー型要素

例えば、プログラムは、これらの日付をプリントアウトする必要があります。

2017年9月30日、2017年10月7日、2017年10月14日、2017- 10-21,2017-10-28。

問題:

  1. リストを印刷リスト
  2. にカレンダー型要素を追加します。
  3. 私はそれを印刷しようとすると、リスト

のほかの印刷時に日付をフォーマットすると、出力は同じ日付の重複のちょうど束です。

public class Weekdays { 
    static Scanner input = new Scanner(System.in); 
    static Calendar temp_cal = Calendar.getInstance(); //temporary calendar object. it's value is being chaged in the process 
    static Calendar start_cal = Calendar.getInstance(); // current day when the program is executed 
    static Calendar end_cal = Calendar.getInstance(); //end date that the user inputs 


static SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); 

public static boolean date_validation(String date){ //partial validation: whether the input date is in a correct format 
    Date test_date; 
    try { 
     test_date = format.parse(date); 

    }catch (ParseException e){ 
     return false; 
     } 
    return true; 
} 
//created list of dates that are of the same day of the week (for example all Sundays) 
static private List<Calendar> getListOfDates(){ 
    List<Calendar> dates = new ArrayList<>(); 
    while (!((temp_cal.get(Calendar.YEAR)>= end_cal.get(Calendar.YEAR))&&(temp_cal.get(Calendar.MONTH) >= end_cal.get(Calendar.MONTH))&&(temp_cal.get(Calendar.DAY_OF_YEAR) >= end_cal.get(Calendar.DAY_OF_YEAR)))) 
    { 
      temp_cal.add(Calendar.DATE, 7); 
      dates.add(temp_cal);  } 
    return dates; 
} 

static private void printListOfDates(List<Calendar> dates){ 

      System.out.println(Arrays.toString(dates.toArray())); 
} 

public static void main(String[] str) throws ParseException{ 

    String end_date = input.next(); 

    while(!(date_validation(end_date))){ 
     end_date = input.next(); 
    } 

    end_cal.setTime(format.parse(end_date));  

    printListOfDates(getListOfDates()); 

} 

入力:2018/01/01

出力(単なる一例をコピーし、全体の出力は、このだけいくつかの重複である):

java.util.GregorianCalendar [時間= 1515233525518、areFieldsSet =真、ゾーン= sun.util.calendar.ZoneInfo [id = "ヨーロッパ/ヘルシンキ"、オフセット= 7200000、dstSavings = 3600000、useDaylight = true、遷移= 118、lastRule = java.util.SimpleTimeZone [id =ヨーロッパ/ヘルシンキ、オフセット= 7200000、dstSavings = 3600000、useDaylight = true、startYear = 0、startMode = 2、startMonth = 2、start endDayOfWeek = 1、endTime = 3600000、endTimeMode = 2]]、firstDayOfWeek = 2、minimalDaysInFirstWeek = 1、endDayOfWeek = 1、startTimeMode = 2、endMode = 2、endMonth = 9、endDay = 4、ERA = 1、YEAR = 2018、MONTH = 0、WEEK_OF_MONTH = 1、DEE_OF_MONTH = 6、DAY_OF_YEAR = 6、DAY_OF_WEEK = 7、DAY_OF_WEEK_IN_MONTH = 1、AM_PM = 1、HOUR = 0、HOUR_OF_DAY = MINUTE = 12、SECOND = 5ミリ秒= 518、ZONE_OFFSET = 7200000、DST_OFFSET = 0]]

+2

従来の 'java.util.Calendar'クラスを避けることを強く勧められません。代わりに、 'java.time'パッケージでユースケースに適したクラスを見つけるべきです。 –

+0

'Calendar'は' before'と 'after'を比較するメソッドを持っています –

+1

' java.time'パッケージのほとんどのクラス(もしそうでなければ)は 'Comparable'を実装しています。 –

答えて

0

最初の問題は、結果をプリントアウトの方法である:あなたがしたい場合

System.out.println(Arrays.toString(dates.toArray())); 

書式設定された日付を使用する場合は、フォーマッタを使用する必要があります。

private static SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd"); 

static private void printListOfDates(List<Calendar> dates){ 
    for (Calendar date : dates) { 
     System.out.println(outputFormat.format(date)); 
    } 
} 

2番目の問題は、getListOfDatesのループで同じtemp_calオブジェクトを再利用しているようです。これにより、同じカレンダーオブジェクト(複数回変更された)の複数のコピーがリストに表示されます。ループ内のすべての反復に対して新しいインスタンスを作成する必要があります。

2

私はこれがあなたのために正しいフォーマットであるかどうかわからないんだけど(私はあなたのための課題として残しておきます)が、あなたはLocalDateを使用して、このような何かを行うことができます:

import java.util.Scanner; 
import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 

class Main { 
    public static void main(String[] args) { 
    Scanner scanner = new Scanner(System.in); 

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 
    LocalDate endDate; 

    while(true){ 
     System.out.print("Enter the endDate in the format of yyyy/MM/dd:"); 
     String date = scanner.next(); 
     try { 
     endDate = LocalDate.parse(date, formatter); 
     break; 
     } catch (Exception e) { 
     System.err.println("ERROR: Please input the date in the correct format"); 
     } 
    } 

    System.out.println("Below are the days between the current day and " + endDate); 
    printDaysBetween(endDate); 
    } 

    public static void printDaysBetween(LocalDate end){ 
    LocalDate start = LocalDate.now(); 
    while (!start.isAfter(end)) { 
     System.out.println(start); 
     start = start.plusDays(7); 
    } 
    } 
} 

使用例:

Enter the endDate in the format of yyyy/MM/dd: 2017-10-30 
ERROR: Please input the date in the correct format 
Enter the endDate in the format of yyyy/MM/dd: 2017/10/30 
Below are the days between the current day and 2017-10-30 
2017-09-30 
2017-10-07 
2017-10-14 
2017-10-21 
2017-10-28 
0
import java.util.Date; 
import java.time.*; 
import java.text.SimpleDateFormat; 
import java.util.*; 
public class days 
{ 
public static void main (String args[]){ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter Dates (Start(yyyy/mm/dd)-End)"); 
    //example 2017 1 5 -> 5 jan 2017 
    getDates(Integer.parseInt(input.next()),Integer.parseInt(input.next()), 
       Integer.parseInt(input.next()),Integer.parseInt(input.next()), 
        Integer.parseInt(input.next()),Integer.parseInt(input.next())); 
    /*the input needed example 
    * 2017 
    * 1 
    * 1  -Start date 
    * 2017 
    * 2 
    * 10  -End date 
    */ 

} 

public static void getDates(int pYearStart, int pMonthStart, int pDayStart, 
            int pYearEnd, int pMonthEnd, int pDayEnd){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMM dd"); 
    int year = pYearStart; 
    int month = pMonthStart-1; 
    int day = pDayStart; 
    Calendar start = new GregorianCalendar(year,month,day); 
    int yearEnd = pYearEnd; 
    int monthEnd = pMonthEnd-1; 
    int dayEnd = pDayEnd; 
    Calendar end = new GregorianCalendar(yearEnd,monthEnd,dayEnd); 
    System.out.print("Start Date: "); 
    System.out.println(sdf.format(start.getTime())); 

    System.out.print("End Date: "); 
    System.out.println(sdf.format(end.getTime())); 

    System.out.println(""); 
    System.out.println("All Dates:"); 

    boolean sameDate = false; 
    int amount = 0; 
    do{ 

     System.out.println(sdf.format(start.getTime())); 
     start.add(Calendar.DAY_OF_MONTH, 7); 
     amount++; 
     if(start.get(Calendar.DAY_OF_MONTH) >= end.get(Calendar.DAY_OF_MONTH) && 
     start.get(Calendar.MONTH) == end.get(Calendar.MONTH)) { 
      sameDate = true;} 
    }while(sameDate != true); 
    System.out.println("No of dates: "+amount); 
    } 
} 

私はリストけどちゃんを使用didntは、これはあなたが望んだと思いますあなたが好きなようにそれをge。