【问题标题】:Get next Hannukah date in C#在 C# 中获取下一个光明节日期
【发布时间】:2015-09-10 06:49:47
【问题描述】:

我试图从今天的 UTC 日期找出下一个光明节的日期。 我已经发现 C# 有 HebrewCalendar 类,并且我能够使用 GetYear()GetMonth()GetDayOfMonth() 获得当前的犹太日期。但是真的不知道如何使用这些信息来获取当前日期接下来会发生的犹太日期。

Hannukah 的日期是 Kislev 的 25 日(犹太历的第 3 个月)。

【问题讨论】:

  • "获取当前日期接下来将要发生的犹太日期"。你的意思是你需要下一个(即将到来的)光明节的希伯来日期?
  • 据我所知,HebrewCalendar 类中没有内置方法可以获取这些日期。
  • @haim770 这正是我所需要的
  • 顺便说一句,这些日期难道不是可以被犹太社区更改吗?有确定的日期吗? AFAIK,光明节不是美国或任何其他国家的公共假期。也许将光明节的所有开始日期保存在自定义数据库表中是一个更好的选择,而不是尝试以编程方式计算它?老实说,我不知道..
  • @SonerGönül 据我所知,这些日子不会被犹太社区改变,我已经计算了许多其他假期,仅将 Hannukah 添加到数据库中会非常不一致。

标签: c# .net date datetime


【解决方案1】:

@DmitryBychenko的回答很好,虽然不想循环,也可以计算一下:

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);

如果您在HebrewCalendar 上未满 25/3,请使用今年,否则使用下一个

结果也是公历 2015 年 12 月 7 日

如果(根据 cmets)您出于某种原因不想要那些 讨厌的 if 语句,您可以执行以下操作:

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);

我不认为这有助于提高可读性,但你去吧

【讨论】:

    【解决方案2】:

    正如 Twitter 上所建议的,这里有一个 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);
    

    最后两个语句的替代方案:

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

    如果我们继续使用feature request 317,这可能会简单得多。例如:

    // Putative API only! Doesn't work yet!
    MonthDay hannukah = new MonthDay(3, 25, calendar);
    var nextHannukah = hannukah.NextOrSame(today);
    

    【讨论】:

      【解决方案3】:

      呃,只是循环?从DateTime.Now 开始,一一测试date

        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;
          }
        }
      

      它返回result == 7 Dec 2015?

      【讨论】:

      • 2015 年 12 月 7 日确实是光明节 5776 的第一天
      • 看起来不错,但我正在考虑一种没有那么多 if 语句的方法
      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2021-12-28
      • 2016-03-24
      • 1970-01-01
      • 2020-01-06
      • 2010-12-07
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多