Java中的一周糟糕的一周

时间:2013-04-25 22:17:34

标签: java gregorian-calendar

我有正确的一年中的问题。我有JTextField,我以DD.MM.YYYY格式输入日期。

private void buttonAddCulturalActionActionPerformed(java.awt.event.ActionEvent evt) {                                               
    String date = textfieldDateOfEvent.getText();
    if (!isCorrectFormatDate(date)) {
        textareaExtract.append("Wrong date format!\n");
        return;
    }
    int day = Integer.parseInt(date.substring(0, 2));
    int month = Integer.parseInt(date.substring(3, 5));
    int year = Integer.parseInt(date.substring(6, 10));
    GregorianCalendar enteredDate = new GregorianCalendar(year, month, day);
    String actionName = textfieldActionName.getText();
    String placeActionName = textfieldPlaceActionName.getText();
    int startHourAction = Integer.parseInt(textfieldStartHourAction.getText());

    if (isAllEntered(actionName, enteredDate, placeActionName, startHourAction)) {
        CulturalAction newAction = new CulturalAction(actionName, enteredDate,
                placeActionName, startHourAction);
        // culturalActions is priority queue
        culturalActions.add(newAction);
        extractAction(newAction);
    } else {
        textareaExtract.append("You need entered all parameters!\n");
    }
}

这里我设置了文化操作(在构造函数中):

public CulturalAction(String nameAction, GregorianCalendar dateAction, String placeAction, int startHourAction) {
    this.nameAction = nameAction;
    this.placeAction = placeAction;
    this.startHourAction = startHourAction;
    // I have private attribute numberOfWeek in class CulturalAction
    cisloTydne = dateAction.get(GregorianCalendar.WEEK_OF_YEAR);
}

当我输入日期10.10.2013时,它将返回45号周,但40正确。我来自捷克共和国。

感谢您的建议!

2 个答案:

答案 0 :(得分:11)

这是问题所在:

GregorianCalendar enteredDate = new GregorianCalendar(year, month, day);

这将是new GregorianCalendar(2013, 10, 10) - 这意味着11月,而不是10月。

来自GregorianCalendar constructor docs

  

month - 用于在日历中设置MONTH日历字段的值。月值基于0。例如,1月份为0。

另外两点建议:

  • 如果 只使用Java库,请使用SimpleDateFormat执行解析,而不是自己动手
  • 如果可以的话,请改用Joda Time,这是一个更明智的API

答案 1 :(得分:0)

TL;博士

LocalDate.parse( "10.10.2013" , DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) )
         .get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
  

41

定义'周'

可以通过各种方式定义一周。

由于您没有定义一周,我将使用标准ISO 8601 week

避免遗留类

问题和Jon Skeet的correct Answer都使用旧的过时日期时间类。现代方法使用java.time类。

完整地解析输入字符串。在实际工作中,如果输入不是预期的格式,则从解析尝试中捕获异常。

String input = "10.10.2013" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd.MM.uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

IsoFields

使用IsoFields课程提取基于周的年份数周。

int week = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
  

41

ThreeTen-Extra YearWeek

另外,请考虑将ThreeTen-Extra库添加到项目中。它提供了一个方便的YearWeek课程来代表ISO 8601周。

YearWeek yw = YearWeek.from( ld ) ;
  

yw.toString():2013-W41