根据年份和年份中的星期获取 LocalDateTime
Get LocalDateTime based on year and week of year
我有两个整数:year
和 week
。我想从这两个值构造一个 LocalDateTime
,其中日期代表特定年份特定周的第一天。
我已经试过了:
LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1);
这并没有给出正确的结果,因为一年的第一天并不总是那年第一周的开始。我似乎也不知道如何获得第一周的第一天。
有什么简单的方法可以用 Java 8 中的日期和时间 API 做到这一点?
注意:我知道我也可以根据给出的答案创建一个解决方法 ,但这似乎牵强附会。也许不是,如果是,请告诉我!
您可以尝试解析您感兴趣的日期的字符串表示形式:
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()
例如。
以下代码将获取 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);
请注意,一年中的一周的概念是特定于语言环境的。在这里,我使用了默认的语言环境,但您可能需要使用用户提供的语言环境。
如果你想去掉时间部分,你可以添加对truncatedTo(ChronoUnit.DAYS)
的调用。
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE);
三十加
ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as YearWeek
.
如果“周”是指标准 ISO 8601 definition of a week-of-year where the week # 1 contains the first Thursday of the year, let the YearWeek
class 为您完成工作。
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 starts on mondayOfYearWeek: 2014-12-29 and ends on sundayOfYearWeek: 2015-01-04
我有两个整数:year
和 week
。我想从这两个值构造一个 LocalDateTime
,其中日期代表特定年份特定周的第一天。
我已经试过了:
LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1);
这并没有给出正确的结果,因为一年的第一天并不总是那年第一周的开始。我似乎也不知道如何获得第一周的第一天。
有什么简单的方法可以用 Java 8 中的日期和时间 API 做到这一点?
注意:我知道我也可以根据给出的答案创建一个解决方法
您可以尝试解析您感兴趣的日期的字符串表示形式:
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()
例如。
以下代码将获取 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);
请注意,一年中的一周的概念是特定于语言环境的。在这里,我使用了默认的语言环境,但您可能需要使用用户提供的语言环境。
如果你想去掉时间部分,你可以添加对truncatedTo(ChronoUnit.DAYS)
的调用。
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE);
三十加
ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as YearWeek
.
如果“周”是指标准 ISO 8601 definition of a week-of-year where the week # 1 contains the first Thursday of the year, let the YearWeek
class 为您完成工作。
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 starts on mondayOfYearWeek: 2014-12-29 and ends on sundayOfYearWeek: 2015-01-04