我想用Java获取日期的一个月
我尝试getday(),但返回星期几
for (int i =0; i<count; i++) {
series1.add(new Task(Names.get(i),
Date.from(LocalDate.of(Dates.get(j).getYear(), Dates.get(j).getMonth(),Dates.get(j).getDay()).atStartOfDay().toInstant(ZoneOffset.UTC)),
Date.from(LocalDate.of(Dates.get(k).getYear(),Dates.get(k).getMonth(),Dates.get(k).getDay()).atStartOfDay().toInstant(ZoneOffset.UTC))
)
);
j+=2;k+=2;
}
答案 0 :(得分:2)
在某些情况下,我调查了您先前的堆栈溢出问题。请不要指望Stack Overflow用户通常会这样做。他们不会。
据我了解,Task
来自JFreeChart,org.jfree.data.gantt.Task
,其构造函数需要两个java.util.Date
参数(开始和结束)。您正在从数据库中获取java.sql.Date
个对象。
虽然您不能(合理地)更改JFreeChart,但是由于JDBC 4.2,您可以利用从数据库中获取现代LocalDate
对象而不是老式java.sql.Date
对象的优势:
while (rs.next()) {
String a = rs.getString("TITRE");
LocalDate startDate = rs.getObject("DATE DEBUT Prévi", LocalDate.class);
LocalDate endDate = rs.getObject("DATE FIN prévi", LocalDate.class);
series1.add(new Task(a,
Date.from(startDate.atStartOfDay().toInstant(ZoneOffset.UTC)),
Date.from(endDate.atStartOfDay().toInstant(ZoneOffset.UTC))
)
);
}
我发现,在构造Task
对象之前,不要将获取的数据放入单独的列表中并再次将其取出来会更简单。在您的代码中,请尽力做到最好。
PS不推荐使用getXxx
和java.sql.Date
的{{1}}方法,因为它们在时区中的运行不可靠,因此即使您无法避免使用这些类,也不要调用这些方法。如果确实从某个地方获得了java.util.Date
,那么要做的第一件事就是调用其java.sql.Date
方法将其转换为现代的toLocalDate
。
编辑:您正在使用嵌套方法调用的单个语句中完成很多工作。我同意巴西尔·布尔克(Basil Bourque)的评论,即读者(和您自己?)很难遵循这一点。我相信这也是为什么人们(包括我自己)不理解您的问题的一部分。我们建议将其分解。一个例子是:
LocalDate
比较麻烦,但现在每个步骤都很容易完成。
我通常不会 Instant startInstant = startDate.atStartOfDay().toInstant(ZoneOffset.UTC);
Date startUtilDate = Date.from(startInstant);
// Similarly for end date
Task newTask = new Task(a, startUtilDate, endUtilDate);
series1.add(newTask);
来做startDate.atStartOfDay().toInstant(ZoneOffset.UTC)
,但这是一个品味或习惯问题。在两种情况下结果都是相同的。
链接
答案 1 :(得分:0)
我假设Dates
是Map
,所以Dates.get(key)
返回存储在地图中的特定日期。
在这种情况下,您可以简单地使用java.util.Calendar
从日期中获取整数形式的月份。
Date dt = Dates.get(key);
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
希望有帮助!