我有正确的一年中的问题。我有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正确。我来自捷克共和国。
感谢您的建议!
答案 0 :(得分:11)
这是问题所在:
GregorianCalendar enteredDate = new GregorianCalendar(year, month, day);
这将是new GregorianCalendar(2013, 10, 10)
- 这意味着11月,而不是10月。
来自GregorianCalendar
constructor docs:
month
- 用于在日历中设置MONTH日历字段的值。月值基于0。例如,1月份为0。
另外两点建议:
SimpleDateFormat
执行解析,而不是自己动手答案 1 :(得分:0)
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
YearWeek
另外,请考虑将ThreeTen-Extra库添加到项目中。它提供了一个方便的YearWeek
课程来代表ISO 8601周。
YearWeek yw = YearWeek.from( ld ) ;
yw.toString():2013-W41