【问题标题】:How to get a date from year, month, week of month and Day of week ? C#如何从年、月、周和周中获取日期? C#
【发布时间】:2016-08-31 03:54:34
【问题描述】:

我有月份、年份、星期几和月份的星期几,基于我想得到一个日期。我怎样才能做到这一点?以下是我的代码,但我没有得到正确的结果。

我在这里错过了什么?

代码:

internal DateTime? GetDate(int year) // year = 2016
{
    int month;
    DateTime? date;

    switch (Type)
    {
        case "CALCULATED":
            month = FixedMonth; // month = 9
            var firstDayOfWeek = new DateTime(year, month, 1); // firstDayOfWeek = 9/1/2016 12:00:00 AM
            while (RestaurantSchedule.GetOneBasedDayOfWeek(firstDayOfWeek) <= DayOfWeek) // DayOfWeek = Monday
            {
                firstDayOfWeek = firstDayOfWeek.AddDays(1);
            }
            date = firstDayOfWeek.AddDays((WeekOfMonth - 1) * 7); // WeekOfMonth = 1, returns date = 9/1/2016 12:00:00 AM
            if (date.Value.Month > month)
            {
                return date.Value.AddDays(-7);
            }
            return date;
        default:
            return new DateTime?();
    }
}

public static OneBasedDayOfWeek GetOneBasedDayOfWeek(DateTime date) // date = 9/1/2016 12:00:00 AM
{
    // returns Thursday
    return (OneBasedDayOfWeek)Enum.Parse(typeof(OneBasedDayOfWeek), date.DayOfWeek.ToString());
}

// OneBasedDayOfWeek uses following enum        
public enum DayOfWeek
{
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7 
}

数据库条目:

HolidayDefinitionId   Type         FixedMonth  FixedDay    DayOfWeek   WeekOfMonth Adjustment  HolidayName     Enabled
--------------------  ------------ ----------- ----------- ----------- ----------- ----------- --------------- -------
LABOR                 CALCULATED   9           0           2           1           0           Labor Day       1
PRESIDENTS            CALCULATED   2           0           2           3           0           President's Day 1

实际结果:

Presidents Day = 02/15/2016
Labor Day = 09/01/2016

预期结果:

Presidents Day = 02/16/2016
Labor Day = 09/05/2016

【问题讨论】:

  • WeekOfMonth 的定义是否足够好?劳动节是九月的“第一个星期一”。如果九月从星期二开始,那么劳动节就是那个月的第二周,不是吗?但是,如果一年的九月从星期日开始,那么它将是该月的第一周。
  • 什么是 OneBasedDayOfWeek?
  • @Kolichikov using OneBasedDayOfWeek = KI.TAS.DomainObjects.Day.DayOfWeek; 基本上使用有问题声明的枚举。
  • @Quantic 你的评论很有道理。

标签: c#


【解决方案1】:

今年的总统日是 2 月 15 日,所以这是正确的。 我有劳动节这样工作: 对于第一部分,我必须假设您想将 Microsoft 的 DateTime (sunday = 0) 转换为 Sunday = 1 枚举。

    public static DayOfWeek GetOneBasedDayOfWeek(DateTime date) // date = 9/1/2016 12:00:00 AM
    {
        // returns Thursday
        return (DayOfWeek)((int)date.DayOfWeek + 1);
    }

在你的 main 函数中,你想要迭代直到你真正达到你的星期几,而不仅仅是在它更少的时候(一旦你到达星期天,你的循环将永远停止,因为(int)Sunday &lt; (int)AnyOtherDay

while (GetOneBasedDayOfWeek(firstDayOfWeek) != DayOfWeek)

我用几年后的日期对此进行了测试,它似乎有效。

【讨论】:

  • 也适合我。我尝试了今年剩余的假期,我得到了准确的值。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
相关资源
最近更新 更多