我有两个整数:year
和week
。我想从这两个值构造一个LocalDateTime
,其中日期代表特定年份特定周的第一天。
我已经尝试过了:
LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1);
这不会给出正确的结果,因为一年的第一天并不总是该年第一周的开始。我似乎无法弄清楚如何获得第一周的第一天。
使用Java 8中的日期和时间API有没有简单的方法呢?
注意:我知道我也可以创建一个给定here答案的解决方法,但这似乎有些牵强。也许它不是,如果是的话,请告诉我!
答案 0 :(得分:11)
以下代码将获得LocalDateTime
并将其设置为给定年份的给定周年的第一天:
int week = 1;
int year = 2016;
WeekFields weekFields = WeekFields.of(Locale.getDefault());
LocalDateTime ldt = LocalDateTime.now()
.withYear(year)
.with(weekFields.weekOfYear(), week)
.with(weekFields.dayOfWeek(), 1);
System.out.println(ldt);
请注意,周年的概念是特定于区域设置的。在这里,我使用了默认的Locale,但您可能需要使用用户提供的语言环境。
如果您想摆脱时间部分,可以添加对truncatedTo(ChronoUnit.DAYS)
的通话。
答案 1 :(得分:3)
您可以尝试解析您感兴趣的那一天的字符串表示:
private static final DateTimeFormatter YEAR_WEEK = DateTimeFormatter.ofPattern("YYYY-w-e", Locale.getDefault());
public static LocalDate fromYearWeek(int year, int week) {
return LocalDate.parse(year + "-" + week + "-1", YEAR_WEEK);
}
如果您需要LocalDateTime,则可以使用localDate.atTime(...)
或localDate.atStartOfDay()
作为示例。
答案 2 :(得分:2)
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE);
答案 3 :(得分:1)
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如YearWeek
。
如果按“周”表示标准ISO 8601 definition of a week-of-year,其中第1周包含一年中的第一个星期四,请让YearWeek
班为您完成工作。
int weekBasedYear = 2015; // Not the calendar year!
int weekOfYear = 1;
YearWeek yearWeek = YearWeek.of ( weekBasedYear , weekOfYear );
您可以获取LocalDate
对象中表示的仅日期值。使用DayOfWeek
枚举指定您想要的星期几,其中星期一是一周的第一天,星期日是最后一天。请记住,ISO周始终在星期一开始,并且始终在星期日结束。
LocalDate mondayOfYearWeek = yearWeek.atDay ( DayOfWeek.MONDAY );
LocalDate sundayOfYearWeek = yearWeek.atDay ( DayOfWeek.SUNDAY );
转储到控制台。请注意本周如何从上一个日历年(2014年)开始,到2015年结束,因为2015年1月1日是星期四,因此它标志着ISO周#1。2015年1月4日的下一个星期日结束了ISO周#1。
System.out.println ( "yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek );
yearWeek:2015-W01从星期一开始,每年周日:2014-12-29,并于星期日结束,每年周日:2015-01-04