【问题标题】:Get Current Week Number (C#)获取当前周数 (C#)
【发布时间】:2020-12-22 09:09:13
【问题描述】:

我一直在查看 Microsoft 的文档和许多堆栈溢出帖子,但似乎没有一个回答我的问题。我想知道在 c# 中获取当前日期的准确周数的最简单和最简单的方法。我对 c# 很陌生,所以请尽量保持简单。我试过使用:

int week = DateTime.Now.DayOfYear/7;
Console.WriteLine(week)

但是在星期一(当我希望它移到下周时)它会显示为前一周。 例如:如果日期是 2020 年 12 月 21 日,则表示当前周是第 50 周,即休息 2 周。然后在 2020 年 12 月 22 日,它会说这是第 51 周,即休息 1 周。

请提前帮助和感谢。

【问题讨论】:

标签: c#


【解决方案1】:

这可能就是你要找的东西:

DateTime dt = new DateTime(2020, 12, 21);
Calendar cal = new CultureInfo("en-US").Calendar;
int week = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
Console.WriteLine(week);

您可以更改CalendarWeekRule参数来更改一年中第一周的定义:

FirstDay 表示一年中的第一周可以有任意长度。例如,如果一年中的第一天是星期日,则将其计为一周,而下一个星期一将计为第二周的一部分。

FirstFourDayWeek表示第一周主要在今年才算。例如,如果一年中的第一天是星期四,则该周将被计算在内,但如果一年从星期五开始,则第一周将不计算在内。

FirstFullWeek 表示将计算的第一周将是一年中的第一个完整周。

【讨论】:

    【解决方案2】:

    当我在 LotusNotes 中编写应用程序时,我也看到了这一点。根据我的发现,一年中的第一周必须包含一个星期四。如果您假设星期日是一周的最后一天,那么星期日的最低日期必须是第四天。考虑到这一点(我对 C# 和所有错综复杂的东西都很陌生)我编写了这段代码,它将为您提供任何给定日期的周数以及今年和前一年的周数。 #

    public class DateCalculations
    {
        private readonly DateTime _weekDate;
    
        private DateTime ThisSunday => GetSundayDate(_weekDate);
        private DateTime FirstDay_ThisYear => DateTime.Parse($"01/01/{ ThisSunday.Year }");
        private DateTime FirstDay_LastYear => DateTime.Parse($"01/01/{ ThisSunday.Year - 1 }");
        private DateTime FirstDay_NextYear => DateTime.Parse($"01/01/{ ThisSunday.Year + 1 }");
        private DateTime FirstSunday_ThisYear => GetSundayDate_WeekOne(FirstDay_ThisYear);
        private DateTime FirstSunday_LastYear => GetSundayDate_WeekOne(FirstDay_LastYear);
        private DateTime FirstSunday_NextYear => GetSundayDate_WeekOne(FirstDay_NextYear);
    
    
        public DateCalculations(string weekDate)
        {
            if (DateTime.TryParse(weekDate, out _weekDate))
            {
                return;
            }
            else
            {
                throw new Exception("Incorrect date has been supplied");
            }
        }
    
        private bool IsDateInFirstWeek(DateTime suppliedDate)
        {
            var output = false;
            // First week must contain a Thursday, so lowest Sunday date possible is the 4th
            if (suppliedDate.Day >= 4)
            {
                output = true;
            }
    
            return output;
        }
    
        private DateTime GetSundayDate(DateTime suppliedDate)
        {
            var checkDay = suppliedDate;
    
            //Check if the day of the supplied date is a Sunday
            while (checkDay.DayOfWeek != DayOfWeek.Sunday)
            {
                checkDay = checkDay.AddDays(1);
            }
            return checkDay;
        }
    
        private DateTime GetSundayDate_WeekOne(DateTime suppliedDate)
        {
            var checkDay = GetSundayDate(suppliedDate);
            if (IsDateInFirstWeek(checkDay) == false)
            {
                checkDay = checkDay.AddDays(7);
            }
    
            return checkDay;
        }
    
        public int WeekNumber()
        {
            var output = 0;
    
            if (ThisSunday == FirstSunday_ThisYear)
            {
                output = 1;
            }
            else if(ThisSunday > FirstSunday_ThisYear)
            {
                TimeSpan daysBetween = ThisSunday - FirstSunday_ThisYear;
                output = (daysBetween.Days/7) + 1;
            }
            else
            {
                TimeSpan daysBetween = ThisSunday - FirstSunday_LastYear;
                output = (daysBetween.Days / 7) + 1;
            }
    
            return output;
        }
    
        public int TotalWeeksThisYear()
        {
            TimeSpan daysBetween = FirstSunday_NextYear - FirstSunday_ThisYear;
    
            return (daysBetween.Days / 7);
        }
    
        public int TotalWeeksLastYear()
        {
            TimeSpan daysBetween = FirstSunday_ThisYear - FirstSunday_LastYear;
    
            return (daysBetween.Days / 7);
        }
    }
    

    我的控制台是用来测试的

    class Program
    {
        static void Main()
        {
            var test = new DateCalculations("2021-01-03");
    
            var weekNumber = test.WeekNumber();
            var totalWeeks = test.TotalWeeksThisYear();
            var pastWeeks = test.TotalWeeksLastYear();
            
            Console.ReadLine();
        }
    }
    

    日期格式可以是日期的任何字符串表示形式(英语或美国)

    希望这会有所帮助。不过它可能需要重构:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      相关资源
      最近更新 更多