2015-09-28 492 views
7

我有兩個整數:yearweek。我想從這兩個值中構建一個LocalDateTime,其中日期表示特定年份的特定星期的第一天。獲取LocalDateTime基於年和周的一年

我已經嘗試過這樣的:

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1); 

這並不能給出正確的結果,因爲這一年的第一天並不總是那年的第一個星期的開始。我似乎無法弄清楚如何獲得第一週的第一天。

有什麼簡單的方法可以用Java 8中的Date和Time API做到這一點嗎?

注:我知道我也可以創建一個解決方案,給出here的答案,但這似乎很牽強。也許這不是,如果是這樣,讓我知道!

+0

周編號是特定於語言環境,所以那些兩個數據點不會給你一個確切的日期。 AFAIK'LocalDateTime'不處理這個事實,但是'GregorianCalendar'。 – biziclop

+0

@biziclop我認爲這正是他想要的。一個特定地區的星期「1」 - 對於一些人來說,第一個4天的星期,對其他人來說是這樣。 – dognose

+0

@dognose然後'GregorianCalendar'的確是要走的路。 – biziclop

回答

9

下面的代碼將獲得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)

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
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE); 
+0

感謝您的回答!我認爲這與assylias的回答非常相似,也有點不完整。也許你可以編輯它來解釋爲什麼它不同。 – bashoogzaad

+0

它是相似的,但避免創建額外的LocalDate實例 – Vovka

1

ThreeTen-EXTRA

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。你可以在這裏找到一些有用的類,如YearWeek

如果以「周」表示標準ISO 8601 definition of a week-of-year,其中第#周包含當年的第一個星期四,請讓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第一週。2015年1月4日的下列星期日結束ISO第一週。

System.out.println ("yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek); 

年周:2015年-W01開始於mondayOfYearWeek:2014年12月29日和sundayOfYearWeek結束:在一年之內2015-01-04

+1

這是好的,但問題是使用其他依賴項。我希望這樣直觀的API被添加到jdk本身中。 –