Tôi có thể thiếu một cái gì đó ở đây, nhưng tôi dường như không thể tìm thấy một lời giải thích trong tài liệu của Joda Time hoặc thực sự bất cứ nơi nào. Có vẻ như thời gian Joda bị phá vỡ khi tính toán tuần khi cộng và trừ các tuần khi bạn đi từ năm này sang năm khác.Joda Time minusweeks() và plusweeks() trong kỳ nghỉ giải lao năm 2014/2015?
Bất cứ ai có thể giải thích lý do tại sao điều này xảy ra và cách thực hiện đúng cách này?
tôi nhận được đầu ra sau đây từ mã của tôi dưới đây:
2015-01-08 - This is the current week
2015-01-01 - Removed one week
2014-12-25 - Removed one week
2014-12-17 - Removed one week //for some reason, program backed 8 days here
2014-12-10 - Removed one week
2014-12-17 - Added one week
2014-12-24 - Added one week
2014-12-31 - Added one week
2014-01-08 - Added one week //for some reason, program forwarded 8 days here, but it did not forward to 2015.
gốc Mã
import org.joda.time.*;
public class WonkyWeeks {
int year;
int week;
public void backUpOneWeek() {
LocalDate today = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
LocalDate lastWeek = today.minusWeeks(1);
week = lastWeek.getWeekOfWeekyear();
year = lastWeek.getYear();
System.out.println(lastWeek+" - Removed one week");
}
public void forwardOneWeek() {
LocalDate today = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
LocalDate nextWeek = today.plusWeeks(1);
week = nextWeek.getWeekOfWeekyear();
year = nextWeek.getYear();
System.out.println(nextWeek+" - Added one week");
}
public void thisWeek() {
LocalDate thisWeek = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
System.out.println(thisWeek+" - This is the current week");
}
public static void main(String[] args) {
WonkyWeeks wonky = new WonkyWeeks();
wonky.week = 2;
wonky.year = 2015;
wonky.thisWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
}
}
Sau khi thử nghiệm thêm nữa, nó được khó hiểu hơn. Tôi đã cố gắng thêm và xóa các ngày thay vì hàng tuần và vì lý do nào đó dường như bỏ qua ngày.
Output:
2015-01-08 - This is the current week
2015-01-07 - removed one day
2015-01-06 - removed one day
2015-01-05 - removed one day
2015-01-04 - removed one day
2015-01-03 - removed one day
2015-01-02 - removed one day
2015-01-01 - Removed one full week
2014-12-31 - removed one day
2014-12-30 - removed one day
2014-12-29 - removed one day
2014-12-28 - removed one day
2014-12-27 - removed one day
2014-12-26 - removed one day
2014-12-25 - Removed one full week
2014-12-23 - removed one day // For some reason, it skipped 2014-12-24?
2014-12-22 - removed one day
2014-12-21 - removed one day
2014-12-20 - removed one day
2014-12-19 - removed one day
2014-12-18 - removed one day
2014-12-17 - Removed one full week
2014-12-16 - removed one day
2014-12-15 - removed one day
2014-12-14 - removed one day
2014-12-13 - removed one day
2014-12-12 - removed one day
2014-12-11 - removed one day
2014-12-10 - Removed one full week
2014-12-11 - added one day
2014-12-12 - added one day
2014-12-13 - added one day
2014-12-14 - added one day
2014-12-15 - added one day
2014-12-16 - added one day
2014-12-17 - Added one week
2014-12-18 - added one day
2014-12-19 - added one day
2014-12-20 - added one day
2014-12-21 - added one day
2014-12-22 - added one day
2014-12-23 - added one day
2014-12-24 - Added one week
2014-12-25 - added one day
2014-12-26 - added one day
2014-12-27 - added one day
2014-12-28 - added one day
2014-12-29 - added one day
2014-12-30 - added one day
2014-12-31 - Added one week
2014-01-02 - added one day //Skipped 2014-01-01 and did not forward to 2015
2014-01-03 - added one day
2014-01-04 - added one day
2014-01-05 - added one day
2014-01-06 - added one day
2014-01-07 - added one day
2014-01-08 - Added one week
Tiếp tục thử nghiệm mã
import org.joda.time.*;
public class WonkyWeeks {
int year;
int week;
public void backUpOneWeek() {
LocalDate today = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
LocalDate adayago = today.minusDays(1);
System.out.println(adayago+" - removed one day");
LocalDate twodaysago = adayago.minusDays(1);
System.out.println(twodaysago+" - removed one day");
LocalDate threedaysago = twodaysago.minusDays(1);
System.out.println(threedaysago+" - removed one day");
LocalDate fourdaysago = threedaysago.minusDays(1);
System.out.println(fourdaysago+" - removed one day");
LocalDate fivedaysago = fourdaysago.minusDays(1);
System.out.println(fivedaysago+" - removed one day");
LocalDate sixdaysago = fivedaysago.minusDays(1);
System.out.println(sixdaysago+" - removed one day");
LocalDate lastWeek = sixdaysago.minusDays(1);
week = lastWeek.getWeekOfWeekyear();
year = lastWeek.getYear();
System.out.println(lastWeek+" - Removed one full week");
}
public void forwardOneWeek() {
LocalDate today = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
LocalDate tomorrow = today.plusDays(1);
System.out.println(tomorrow+" - added one day");
LocalDate dayAfterTomorrow = tomorrow.plusDays(1);
System.out.println(dayAfterTomorrow+" - added one day");
LocalDate threeDaysFromNow = dayAfterTomorrow.plusDays(1);
System.out.println(threeDaysFromNow+" - added one day");
LocalDate fourDaysFromNow = threeDaysFromNow.plusDays(1);
System.out.println(fourDaysFromNow+" - added one day");
LocalDate fiveDaysFromNow = fourDaysFromNow.plusDays(1);
System.out.println(fiveDaysFromNow+" - added one day");
LocalDate sixDaysFromNow = fiveDaysFromNow.plusDays(1);
System.out.println(sixDaysFromNow+" - added one day");
LocalDate nextWeek = sixDaysFromNow.plusDays(1);
week = nextWeek.getWeekOfWeekyear();
year = nextWeek.getYear();
System.out.println(nextWeek+" - Added one week");
}
public void thisWeek() {
LocalDate thisWeek = new LocalDate()
.withDayOfWeek(4)
.withWeekOfWeekyear(week)
.withYear(year);
System.out.println(thisWeek+" - This is the current week");
}
public static void main(String[] args) {
WonkyWeeks wonky = new WonkyWeeks();
wonky.week = 2;
wonky.year = 2015;
wonky.thisWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.backUpOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
wonky.forwardOneWeek();
}
}
tôi khuyên bạn nên gọt xuống mã ví dụ của bạn để xương trần của những gì cần thiết để tái tạo hành vi này. (có thể bạn sẽ khám phá ra một lỗi trong logic của riêng bạn trong khi bạn đang làm điều này) – bdares
@bdares Làm thế nào nó có thể có thể được chia nhỏ hơn nữa? Tất cả các mã không là tạo ra một thể hiện của 'LocalDate', đặt nó vào thứ năm thứ hai của năm và sau đó cuộn trở lại và chuyển tiếp bằng cách sử dụng' cộng' và 'trừ' phương pháp được cung cấp bởi Joda? –
Hay đúng hơn, nó tạo ra một vài trường hợp, nhưng tôi cũng nghĩ như vậy? –