2012-07-05 19 views
6

Sử dụng thư viện NodaTime, làm cách nào tôi có thể tính LocalDate của ngày đầu tiên của tuần dựa trên số Tuần và Tuần Tuần.LocalDate từ Tuần và TuầnYăm

Điều ngược lại điều này:

var date = new LocalDate(2012, 1, 1); 
int weekYear = date.WeekYear;  // 2011 
int weekNr = date.WeekOfWeekYear; // 52 

Something như mã giả này:

var newDate = LocalDate.FirstDayFromWeek(weekYear, weekNr); 
+0

Bạn đã kiểm tra này http://stackoverflow.com/questions/7130948/joda-time-most-recent-week-and- tháng ? – V4Vendetta

+1

@ V4Vendetta: Đó là thời gian Joda, đó là nhiều hơn nữa ambivalent về cách ngày được xây dựng. Thời gian Noda chủ yếu là năm/tháng/ngày làm trung tâm. Đó không phải là để nói điều đó là không thể :) –

Trả lời

8

Trước hết, bạn nên nhìn vào cách xây dựng có liên quan LocalDate - đó là tất cả những thông tin bạn một cách logic có nếu bạn có một số WeekYearWeekOfWeekYear. Sau đó, bạn có thể nhận được LocalDateTime từ LocalDate với AtMidnight nếu bạn thực sự muốn - nhưng tôi muốn gắn bó với LocalDate cho đến khi bạn thực sự cần bất kỳ điều gì khác, như cách bạn tổng hợp ít thông tin hơn.

Tôi không tin rằng hiện tại chúng tôi thực hiện điều này đặc biệt đơn giản, mặc dù động cơ cơ bản hỗ trợ đủ tính toán mà chúng tôi có thể thêm nó khá dễ dàng.

Nếu không có bất kỳ thay đổi API, tôi sẽ đề nghị bạn có thể muốn được giảm giá tốt nhất với một cái gì đó như:

  • Thi công ngày 01 tháng 6 trong năm mong muốn, mà cần phải có cùng WeekYear (Tôi giả định bạn đang sử dụng lịch ISO ...)
  • Hãy đi thẳng vào ngày đầu tiên của tuần (date = date.Previous(IsoDayOfWeek.Monday))
  • làm việc ra số tuần hiện tại
  • Thêm hoặc trừ đi số bên phải của tuần

Vì vậy, một cái gì đó như:

public static LocalDate LocalDateFromWeekYearAndWeek(int weekYear, 
    int weekOfWeekYear) 
{ 
    LocalDate midYear = new LocalDate(weekYear, 6, 1); 
    LocalDate startOfWeek = midYear.Previous(IsoDayOfWeek.Monday); 
    return startOfWeek.PlusWeeks(weekOfWeekYear - startOfWeek.WeekOfWeekYear); 
} 

Không khủng khiếp dễ chịu hay hiệu quả, nhưng không phải quá xấu ... nếu bạn thấy mình muốn làm rất nhiều công việc với WeekOfWeekYearWeekYear, xin hãy giơ yêu cầu tính năng cho loại điều bạn muốn làm.

EDIT: Cũng giống như một bản cập nhật, chúng tôi bây giờ hỗ trợ này:

LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday); 
+0

Cảm ơn! Có lẽ tôi sẽ tạo một yêu cầu tính năng. Để lưu ý: để thuận tiện trong mã của tôi, tôi có một struct: 'struct Week {int Year; int WeekNr; } ' –

Các vấn đề liên quan