我需要通过传递这些参数来获取日期
- 年份
- 周数(一个月),即 1、2、3、4、5
- 天数(一周)0(星期日)至 6(星期六)
- 月份
我在 Calendar
类中查找了构造函数,但不包含这些参数。
最佳答案
尽管你的标签我同意 Joe C 的评论,但你应该更喜欢现代 Java 日期和时间 API(又称为 java.time
或 JSR-310),而不是早已过时的 日历
和 friend 。现代类对程序员更友好,更容易使用,它们带来的惊喜更少,导致代码更清晰、更自然(至少当您习惯了流畅的风格时),并且如果您犯了错误,则更容易调试。
我不知道你如何计算一个月中的几周。我假设第一周从该月的第一周开始,持续 7 天(因此第二周从该月的 8 号开始,第五周从该月的 29 号开始)。如果计数不同,请参阅Hugo’s answer .
我建议这个方法:
public static LocalDate weekNoAndDayToDate(Year year, Month month, int weekOfMonth, int dayOfWeek) {
// find day of week: convert from 0 (Sunday) to 6 (Saturday)
// to DayOfWeek, from 1 (Monday) to 7 (Sunday)
DayOfWeek dow;
if (dayOfWeek == 0) { // Sunday
dow = DayOfWeek.SUNDAY;
} else {
dow = DayOfWeek.of(dayOfWeek);
}
return year.atMonth(month)
.atDay(1)
.with(TemporalAdjusters.nextOrSame(dow))
.with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekOfMonth);
}
例如,我们可以这样做
LocalDate today = weekNoAndDayToDate(Year.of(2017), Month.JULY, 1, 1);
这会产生
2017-07-03
如果您需要 Date
或 GregorianCalendar
(例如,对于无法更改的旧 API),请执行以下操作之一:
Date oldfashiondDateObject
= Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
GregorianCalendar oldfashionedCalendarObject
= GregorianCalendar.from(today.atStartOfDay(ZoneId.systemDefault()));
在这两种情况下,不同时区的结果都会不同(旧类的固有问题之一)。在我的计算机上,第一个生成的日期
为
Mon Jul 03 00:00:00 CEST 2017
第二个生成的 GregorianCalendar
等于同一时间点。
关于java - java中如何通过周数和日数(Week)来确定日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893620/