【问题标题】:How to get work week from two dates [duplicate]如何从两个日期开始工作周[重复]
【发布时间】:2014-02-06 08:41:03
【问题描述】:

假设我有两个日期订单日期 - 2014 年 1 月 1 日和交货日期 - 2014 年 6 月 2 日。现在如果我想计算它花费了多少工作周(订单日期 - 交货日期),我该如何在 c# 中做到这一点。

【问题讨论】:

  • 提供更多细节。你如何存储日期?你已经尝试过什么?
  • 我试过这样 - (交货日期 - 订单日期).TotalDays/7。我将输出存储为 int
  • 不会吧。 “工作周”的数量与 nr 相同。正常周?它们有何不同?
  • @Magnus 考虑周五到周一。这是半周但 2 个工作周

标签: c#


【解决方案1】:

如果你想要一个日期范围内的工作日数,你可以使用这个:

        var from = DateTime.Today.AddDays(-10);
        var to = DateTime.Today;
        var daysOfWeek = new DayOfWeek[] { DayOfWeek.Monday, DayOfWeek.Tuesday
                                          , DayOfWeek.Wednesday, DayOfWeek.Friday
                                          , DayOfWeek.Thursday };


        var days = Enumerable.Range(0, 1 + to.Subtract(from).Days)
                             .Select((n, i) => from.AddDays(i).DayOfWeek)
                             .Where(n => daysOfWeek.Contains(n.DayOfWeek));

如果您想要某个日期范围内的周数,请使用:

        (int)((to - from).TotalDays/7)

【讨论】:

  • 哇,这是一个绝妙的解决方案!我肯定会写下这个。我已经对其进行了测试,它就像一个魅力。
【解决方案2】:
(int)((DeliveryDate-OrderDate).TotalDays/7)

【讨论】:

  • 但这会给出 1.8 或 1.9 的结果
  • @Gulrej 您必须使用 Math.Round 或 Math.Ceiling 对其进行舍入
【解决方案3】:

我假设“多少工作周”是指“多少工作日”。这不是那么简单,因为它取决于文化,并且您需要将假期考虑在内。

如果您依靠周一到周五作为工作日,您可以使用类似于c# DateTime to Add/Subtract Working Days 中讨论的解决方案,从Order DateDelivery Date 计算条件成立的每一天。

问答仍然给您留下了如何确定某个地区的假期的问题(请注意 - 在瑞士,该国的每个地区都有不同的假期!)。

更新:从 Nagaraj 建议的链接中,我了解到您可能还将“周”称为块(即“它花费了多少 多少 个工作周”)。如果是这样,那么您将需要定义一周中有多少天必须考虑到一周...

【讨论】:

    【解决方案4】:

    我正在使用字符串并将其转换为日期,因为我不确定您从哪里获得日期以及以什么形式。相应地调整您的代码。

    string orderDate = @"1/1/2014";
    string deliveryDate = @"6/2/2014";
    
    // This will give you a total number of days that passed between the two dates.
    double daysPassed = Convert.ToDateTime(deliveryDate).
                        Subtract(Convert.ToDateTime(orderDate)).TotalDays;
    
    // Use this if you want actual weeks.  This will give you a double approximate.  Change to it to an integer round it off (truncate it).
    double weeksPassed = daysPassed / 7;
    
    // Use this if you want to get an approximate number of work days in those weeks (based on 5 days a week schedule).
    double workDaysPassed = weeksPassed * 5;
    

    【讨论】:

      【解决方案5】:

      我猜你对工作日不感兴趣,而是对几周感兴趣。您可以使用 GetWeekOfYear:

      http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear%28v=vs.110%29.aspx

      编辑

      要回复评论,这里有一些代码示例:

      int start = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(new DateTime(2014, 1, 14), System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
      int end = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(new DateTime(2014, 2, 3), System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
      int weeks = end - start;
      

      这应该会给你所需的几周时间。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • @dTDesign 没有想到微软可能会更改地址 - 你完全正确。我会记住它以备将来的答案
      猜你喜欢
      • 2022-12-11
      • 2017-09-17
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2022-07-17
      相关资源
      最近更新 更多