2015-09-10 13 views
5

Tôi đang cố gắng tìm hiểu từ ngày UTC của ngày hôm nay là ngày của Hannukah tiếp theo. Tôi đã tìm thấy rằng C# có lớp học HebrewCalendar và tôi có thể lấy ngày Do Thái hiện tại với GetYear(), GetMonth()GetDayOfMonth(). Nhưng không thực sự biết làm thế nào để làm việc với thông tin này để có được ngày của người Do Thái sẽ xảy ra tiếp theo cho ngày hiện tại.Nhận ngày Hannukah tiếp theo ở C#

Hannukah được ghi ngày 25 của Kislev (tháng thứ ba theo lịch Do Thái).

+0

"để có ngày Do Thái sắp diễn ra tiếp theo cho ngày hiện tại". Bạn có nghĩa là bạn cần ngày tiếng Hebrew của Hannukah sắp tới (sắp tới)? – haim770

+0

Không có cách nào được xây dựng trong lớp học "HebrewCalendar' để có được những ngày này theo như tôi biết. –

+0

@ haim770 chính xác là những gì tôi cần – Dracke

Trả lời

3

@ câu trả lời DmitryBychenko là tốt, mặc dù nếu bạn không muốn lặp lại, bạn cũng có thể tính toán nó:

var calendar = new HebrewCalendar(); 
var result = DateTime.UtcNow; 
if(
     calendar.GetMonth(result) < 3 
    || (calendar.GetMonth(result)==3 && calendar.GetDayOfMonth(result)<25) 
) 
    result = new DateTime(calendar.GetYear(result), 3, 25, calendar); 
else 
    result = new DateTime(calendar.GetYear(result)+1, 3, 25, calendar); 

Nếu bạn dưới 25/3 trên HebrewCalendar, sử dụng trong năm nay, việc sử dụng khác tiếp theo

Kết quả cũng là 7 tháng 12 2015 trong lịch Gregorian

Nếu (theo các ý kiến) bạn không muốn những peskyif báo cáo đối với một số lý do, bạn có thể làm điều gì đó như:

var calendar = new HebrewCalendar(); 
var result = DateTime.UtcNow; 
var addYear = (calendar.GetMonth(result) < 3 || (calendar.GetMonth(result)==3 && calendar.GetDayOfMonth(result)<25)) ? 0 : 1; 
result = new DateTime(calendar.GetYear(result) + addYear, 3, 25, calendar); 

Tôi không nghĩ rằng điều này giúp dễ đọc nhưng có bạn đi

1

Eh, chỉ cần lặp? Thử nghiệm date từng cái một bắt đầu từ, ví dụ: DateTime.Now?

HebrewCalendar calendar = new HebrewCalendar(); 
    DateTime result = DateTime.Now; 

    for (DateTime date = DateTime.Now.Date; ; date = date.AddDays(1)) { 
    if (calendar.GetDayOfMonth(date) == 25 && calendar.GetMonth(date) == 3) { 
     result = date; 

     break; 
    } 
    } 

trả về result == 7 Dec 2015?

+0

7 tháng 12 năm 2015 thực sự là ngày đầu tiên của Hannukah 5776 – haim770

+0

Có vẻ ổn nhưng tôi đã suy nghĩ về một cách không có nhiều câu lệnh if – Dracke

4

Vì nó đã được đề xuất trên Twitter, đây là một giải pháp Noda Time:

// As of 2.0, it will be CalendarSystem.HebrewCivil 
var calendar = CalendarSystem.GetHebrewCalendar(HebrewMonthNumbering.Civil); 
var today = SystemClock.Instance.InZone(DateTimeZone.Utc, calendar).Date; 

var thisHannukah = new LocalDate(today.Year, 3, 25, calendar); 
return thisHannukah >= today ? thisHannukah : thisHannukah.PlusYears(1); 

Alternative cho người cuối cùng hai tuyên bố:

var year = today.Month < 3 || today.Month == 3 && today.Day <= 25 
    ? today.Year : today.Year + 1; 
return new LocalDate(year, 3, 25, calendar); 

Nếu chúng tôi tiếp tục với feature request 317, điều này có thể đơn giản hơn nhiều. Ví dụ:

// Putative API only! Doesn't work yet! 
MonthDay hannukah = new MonthDay(3, 25, calendar); 
var nextHannukah = hannukah.NextOrSame(today); 
Các vấn đề liên quan