0

我对一年中的正确星期有疑问。我有 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 是正确的。我来自捷克共和国。

谢谢你的建议!

4

2 回答 2

11

这就是问题:

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

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

GregorianCalendar构造函数文档

month- 用于设置日历中 MONTH 日历字段的值。月份值从 0 开始。例如,0 表示一月。

另外两个建议:

  • 如果您必须只使用 Java 库,请使用SimpleDateFormat来执行解析,而不是自己进行
  • 如果可以,请改用Joda Time,这是一个更明智的 API
于 2013-04-25T22:19:33.227 回答
0

tl;博士

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

41

定义“周”

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

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

避免遗留类

Jon Skeet的问题和正确答案都使用旧的过时日期时间类。现代方法使用 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

三十-额外YearWeek

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

YearWeek yw = YearWeek.from( ld ) ;

yw.toString(): 2013-W41

于 2017-07-11T00:06:13.943 回答