【问题标题】:How to get date from week number and week day C#如何从周数和工作日 C# 获取日期
【发布时间】:2016-06-04 06:22:46
【问题描述】:

如何从 C# 中的周数和周数获取日期。使用日历周规则。 例如,我有第 43 周和第 3 周。现在我想要日期。

提前致谢。

【问题讨论】:

  • 你能给出更具体的例子吗?
  • 你的第一个问题是关于 SQLServer,人们给你三个答案,现在你完全改变了它,C# 也需要它。我建议您将问题回滚到第一个状态并创建有关 C# 的新问题。
  • 我不能提出新问题,所以我改变了这个问题。也因为没有答案是有效的。
  • 好吧,那么祝你好运:)

标签: c# asp.net date


【解决方案1】:
static DateTime GetDateFromWeekNumberAndDayOfWeek(int weekNumber, int dayOfWeek)
        {
            DateTime jan1 = new DateTime(2012, 1, 1);
            int daysOffset = DayOfWeek.Tuesday - jan1.DayOfWeek;

            DateTime firstMonday = jan1.AddDays(daysOffset);

            var cal = CultureInfo.CurrentCulture.Calendar;
            int firstWeek = cal.GetWeekOfYear(jan1, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

            var weekNum = weekNumber;
            if (firstWeek <= 1)
            {
                weekNum -= 1;
            }

            var result = firstMonday.AddDays(weekNum * 7 + dayOfWeek - 1);
            return result;
        }

http://forums.asp.net/t/1850105.aspx?Get+date+from+weeknumber

【讨论】:

  • 今天使用此代码时记得更改年份(也许将其添加为参数):)
【解决方案2】:

可以这样计算:

declare @weeks table (week1 int, week2 int)
declare @today date = getdate()

select @@DATEFIRST

insert into @weeks(week1, week2)
values (12, 15)

;with computed_calendar as
(
  select
    @today today,
    datepart(week, @today) as current_week,
    datepart(weekday, @today) as current_weekday,

    w.week1,
    dateadd(week, w.week1-datepart(week, @today), @today) as week1_some_date,
    dateadd(day, 1-datepart(weekday, @today), dateadd(week, w.week1-datepart(week, @today), @today)) as week1_start,

    w.week2,
    dateadd(week, w.week2-datepart(week, @today), @today) as week2_some_date,
    dateadd(day, -datepart(weekday, @today), dateadd(week, w.week2+1-datepart(week, @today), @today)) as week2_end
  from @weeks w
)
select
  cc.today, cc.current_week, cc.current_weekday,

  cc.week1_start,
  datepart(week, cc.week1_start) week_1, 
  datename(weekday, cc.week1_start) week1_weekday,

  cc.week2_end,
  datepart(week, cc.week2_end) week_2,
  datename(weekday, cc.week2_end) week2_weekday
from computed_calendar cc

在最后选择周和工作日计算以确保一切正常。您可以尝试将 DATEFIRST 移动到星期一或星期日,并检查脚本是否返回正确的结果。

您也可以提取当前日期的年数并将周数添加到 1 月 1 日。 我的方法演示了如何将周差添加到当前日期并从当前日期删除“额外”工作日以获得所需的工作日。

您要测试的时间段在week1_startweek2_end 之间。

另一种测试周期的方法

您知道周数,并且您确切地知道范围界限总是从第 1 周的开始和第 2 周的结束,所以

只需检查您要测试的日期的周数是否在给定的周数内

select
... 
where datepart(week, my_date) between week1 and week2

注意,如果年份不同,它可能会失败。虽然最初的周数并不能说明它们属于哪一年。

【讨论】:

    【解决方案3】:

    以下查询将为您提供一年中所有周的星期一和星期日

    DECLARE @y int = 2016 
    -- Find if it is leap year or not
    DECLARE @leap int = IIF(DATEPART(dd,(EOMONTH(CONCAT(@y,'0201')))) = 29,1,0)
    DECLARE @totalDays int = IIF(@leap = 1, 366, 365)
    
    ;WITH tally AS (
        -- select 365 or 366 (for leap year) days 
        SELECT top (@totalDays) name
          , ROW_NUMBER() OVER (ORDER BY object_id) Rn
        from sys.all_objects
    )
    , cc2 as (
        SELECT cast(DATEADD(d, Rn - 1, '2016-01-01') AS date) dayNo
        FROM tally
    )
    , cc3 as (
        SELECT dayNo, DATEPART(ww, dayNo) weekNo
        FROM cc2
    )
    , cc4 as (
        SELECT weekNo, min(dayNo) FirstDay
        FROM cc3
        GROUP BY weekNo
    )
    SELECT weekNo
      , cast(DATEADD(wk, DATEDIFF(wk, 0, FirstDay), 0) as date) Monday
      , cast(DATEADD(wk, DATEDIFF(wk, 0, FirstDay), 6) as date) Sunday
    FROM cc4
    

    结果将类似于以下示例:

    weekNo  Monday      Sunday
    1       2015-12-28  2016-01-03
    2       2016-01-04  2016-01-10
    3       2016-01-11  2016-01-17
    4       2016-01-18  2016-01-24
    5       2016-01-25  2016-01-31
    6       2016-02-01  2016-02-07
    7       2016-02-08  2016-02-14
    ....
    12      2016-03-14  2016-03-20
    13      2016-03-21  2016-03-27
    14      2016-03-28  2016-04-03
    15      2016-04-04  2016-04-10
    16      2016-04-11  2016-04-17
    ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多