删除的答案是正确的。我不明白为什么它被撤回了。
java.time
问题使用了麻烦的旧日期时间类,这些类已被 Java 8 及更高版本中内置的 java.time 框架所取代。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
您需要一个时区来获取当前日期。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
使用TemporalAdjusters 获取前一个星期一。 DayOfWeek 是一种方便的方式来表示一周中的每一天。
LocalDate previousOrSameMonday = today.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
如果您需要一周的最后一天用于其他目的,您可以执行以下操作。但是对于问题中描述的显示,不需要存储这个nextSunday 对象。您可以随时计算它,因为您知道它总是在一周开始后六天。
LocalDate nextSunday = previousOrSameMonday.with( TemporalAdjusters.next( DayOfWeek.SUNDAY ) );
现在您必须将一周的开始日期存储在班级成员中,以便留在内存中。在您的 gestion_date 方法中定义的局部变量在每次执行完成后都会消失。您可以在某个地方存储当前显示在 Swing 表单中的数据。我不知道那个地方在哪里,因为你在你的问题中没有提到。所以在这里我发明了一个虚构的名称modelBehindMySwingForm,其中“模型”的意思是“我的应用的业务数据”。
modelBehindMySwingForm.weekStart = previousOrSameMonday;
每次单击加法或减法按钮时,将该成员变量增加一周。
modelBehindMySwingForm.weekStart = modelBehindMySwingForm.weekStart.plusWeeks( 1 ); // Or minusWeeks
并使用代表LocalDate 对象值的字符串更新JLabel 小部件。您可以通过调用toString 获取ISO 8601 格式的日期。最好让 java.time 使用 DateTimeFormatter 为您本地化。将格式化程序对象存储在某处,例如您的modelBehindMySwingForm,因为重新创建它没有任何意义。
Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT );
formatter = formatter.withLocale( locale );
如上所示递增modelBehindMySwingForm.weekStart 后,使用格式化程序生成字符串以显示在您的 JLabel 对象中。
String start = modelBehindMySwingForm.weekStart.format( modelBehindMySwingForm.formatter ); // Monday
String stop = modelBehindMySwingForm.weekStart.plusDays( 6 ).format( modelBehindMySwingForm.formatter ); // Following Sunday.