【发布时间】:2021-01-31 21:46:21
【问题描述】:
所以我在 Java 的 Date 中遇到了这种奇怪的问题。
此问题的入口点是 2 个字符串日期 startDate("30 Jan 2016") 和 endate ""29 Jan 2017"。
这个问题有点复杂,但我已经总结了这个案例。
我需要做的是从这些数据开始,得到一个与下面的完全一样的 1 年时间表。
该表包含每个月的:第一天、最后一天以及这两天之间的天数。
预期结果:
/**
-
2016 年 1 月 30 日星期六 00:00:00 GMT - 2016 年 2 月 28 日星期日 23:59:59 GMT - 30
-
2016 年 2 月 29 日星期一 00:00:00 GMT - 2016 年 3 月 29 日星期二 23:59:59 BST - 30
-
2016 年 3 月 30 日星期三 00:00:00 BST - 2016 年 4 月 29 日星期五 23:59:59 BST 2016 年 - 31
-
2016 年 4 月 30 日星期六 00:00:00 BST - 2016 年 5 月 29 日星期日 23:59:59 BST - 30
-
2016 年 5 月 30 日星期一 00:00:00 BST - 2016 年 6 月 29 日星期三 23:59:59 BST - 31
-
2016 年 6 月 30 日星期四 00:00:00 BST - 2016 年 7 月 29 日星期五 23:59:59 BST 2016 年 - 30
-
2016 年 7 月 30 日星期六 00:00:00 BST - 2016 年 8 月 29 日星期一 23:59:59 BST - 31
-
2016 年 8 月 30 日星期二 00:00:00 BST - 2016 年 9 月 29 日星期四 23:59:59 BST - 31
-
2016 年 9 月 30 日星期五 00:00:00 BST 2016 年 10 月 29 日星期六 23:59:59 BST 2016 年 - 30
-
2016 年 10 月 30 日星期日 00:00:00 BST - 2016 年 11 月 29 日星期二 23:59:59 GMT - 31
-
2016 年 11 月 30 日星期三 00:00:00 GMT - 2016 年 12 月 29 日星期四 23:59:59 GMT - 30
-
2016 年 12 月 30 日星期五 00:00:00 GMT - 2017 年 1 月 29 日星期日 23:59:59 GMT - 31
*/
我的结果是
2016 年 1 月 30 日星期六 00:00:00 EET ::::: 2016 年 2 月 28 日星期日 23:59:59 EET ::::: 29
2016 年 2 月 29 日星期一 00:00:00 EET ::::: 2016 年 3 月 28 日星期一 23:59:59 EEST ::::: 28
2016 年 3 月 29 日星期二 00:00:00 EEST ::::: Thu Apr 28 23:59:59 EEST 2016 ::::: 30
2016 年 4 月 29 日星期五 00:00:00 EEST ::::: 2016 年 5 月 28 日星期六 23:59:59 EEST ::::: 29
2016 年 5 月 29 日星期日 00:00:00 EEST ::::: 2016 年 6 月 28 日星期二 23:59:59 EEST ::::: 30
2016 年 6 月 29 日星期三 00:00:00 EEST ::::: Thu Jul 28 23:59:59 EEST 2016 ::::: 29
2016 年 7 月 29 日星期五 00:00:00 EEST ::::: 2016 年 8 月 28 日星期日 23:59:59 EEST ::::: 30
2016 年 8 月 29 日星期一 00:00:00 EEST ::::: 2016 年 9 月 28 日星期三 23:59:59 EEST ::::: 30
2016 年 9 月 29 日星期四 00:00:00 EEST ::::: Fri Oct 28 23:59:59 EEST 2016 ::::: 29
2016 年 10 月 29 日星期六 00:00:00 EEST ::::: Mon Nov 28 23:59:59 EET 2016 ::::: 31
2016 年 11 月 29 日星期二 00:00:00 EET ::::: 2016 年 12 月 28 日星期三 23:59:59 EET ::::: 29
2016 年 12 月 29 日星期四 00:00:00 EET ::::: 2017 年 1 月 28 日星期六 23:59:59 EET ::::: 30
所以我不确定这是因为 2 月,还是因为 2016 年是闰年,其中包括 2 月 29 日。
我错过了什么?我有同样的问题,运行多个测试用例,其他都可以,但是这个。
我也尝试使用 Javas 8 LocalDate 和 LocalDateTime 执行此操作,得到完全相同的结果。
这是我的代码
import org.apache.commons.lang.time.DateUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Main {
public static void main(String[] args) throws ParseException {
String startDate = "30 Jan 2016";
String endDate = "29 Jan 2017"; // current not using this ?!
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
Date start = formatter.parse(startDate);
List<Item> items = new ArrayList<>();
for (int i = 0; i < 12; i++) {
Date end = DateUtils.addMonths(start, 1);
end = DateUtils.addSeconds(end, -1);
items.add(new Item(start, end));
start = DateUtils.addMonths(start, 1);
}
items.forEach(item -> {
System.out.println(item.getStart() + " ::::: " + item.getEnd() + " ::::: " + getDifferenceDays(item.getStart(), item.getEnd()));
});
}
public static long getDifferenceDays(Date d1, Date d2) {
return ChronoUnit.DAYS.between(d1.toInstant(), d2.toInstant());
}
}
- 物品类别
import java.util.Date;
public class Item {
Date start;
Date end;
public Item(Date start, Date end) {
this.start = start;
this.end = end;
}
public Date getStart() {
return start;
}
public void setStart(Date start) {
this.start = start;
}
public Date getEnd() {
return end;
}
public void setEnd(Date end) {
this.end = end;
}
@Override
public String toString() {
return "Item{" +
"start=" + start +
", end=" + end +
'}';
}
}
【问题讨论】:
-
好吧,对于初学者,您不应该使用
Date、Calendar和SimpleDateFormat类。他们很麻烦。请改用java.time中的类。 -
正如我所说...我使用了 Javas 8 LocalDate 和 LocalDateTime 并且得到了相同的行为。
-
你试过docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html;设置一个区域。哦,我看到 DateUtils 是一个外部库,回想一下我对它的评论。
-
DateUtils 来自导入 org.apache.commons.lang.time.DateUtils;我不明白 ZonedDateTime 类的确切含义。仍然 O 将我的计算机日期更改为 GTM,而不是我得到相同的时区,但日期行为是相同的。
-
PeterMmm 是正确的:您没有正确使用 DateUtils。但更重要的是,如果您使用的是 Java 8 或更高版本,那么使用新的 Java“时间”会更好。建议:请尝试 Ole V.V 的建议。如果可行,请“支持”并“接受”它。