【问题标题】:Do not include weekends in date time日期时间中不包括周末
【发布时间】:2015-03-13 07:16:09
【问题描述】:

我只想知道如何在不包括周末的情况下计算 DateTime(目前正在制作图书馆系统)。图书馆在周末不开放,这就是为什么我需要计算不包括周末的日期。 前任。 2015 年 3 月 13 日 = 星期五,我借了 5 天。所以,返回日期应该是 03/20/15= 星期五(因为我没有包括周末) 你能告诉我或给我一些想法吗?谢谢!

编辑:(当我输入数字时程序突然冻结)

int days = 0;
DateTime deyt = DateTime.Now;
rd.Text = deyt.ToString("MM/dd/yy");
DateTime dt = deyt.AddDays(int.Parse(textBox3.Text));


DateTime span = deyt;
while (span < dt.AddDays(1))
{
    if (span.DayOfWeek != DayOfWeek.Saturday && span.DayOfWeek != DayOfWeek.Sunday)
    {
        days++;
        span = span.AddDays(1);
        bd.Text = days.ToString("MM/dd/yy");
    }
}

【问题讨论】:

  • 您目前正在尝试的一些代码会有所帮助。
  • “不包括周末”是什么意思?您要执行什么计算? Access 从哪里来?您的问题太模糊,我们目前无法为您提供帮助。 (我怀疑实际上你会想要排除公共假期和其他事情......)
  • 如果像@JonSkeet 建议的那样,除了周末之外,您还需要考虑法定(公共)假期,那么您可能需要使用日期表。这种方法的一个简单示例是我的另一个答案here
  • 我现在有我的代码了。请参阅我的帖子中的编辑。谢谢
  • 对,所以您实际上要做的是“添加天数,不包括周末”。根据“计算日期时间”,这一点都不清楚。我还强烈建议您将计算与 GUI 更新和一般文本处理分开。

标签: c# ms-access


【解决方案1】:

如果您有 DateTimes 列表,则可以过滤掉周末日期:

public static List<DateTime> GetDatesWithoutWeekends(List<DateTime> dates)
{
    return
        dates.Where(date => (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday))
                .ToList();
}

【讨论】:

  • 我现在有我的代码了。在我的帖子中看到它作为编辑。谢谢。
【解决方案2】:
DateTime date = DateTime.Now // Set your Date

if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)   
{
//TODO
}

【讨论】:

  • 使用枚举值名称而不是转换为 int 会更清楚。根本就明显值 6 代表什么,例如...
  • 您好,虽然这可能很好地回答了这个问题,但请注意,其他用户可能不像您那样知识渊博。您为什么不添加一些关于此代码为何有效的解释?谢谢!
  • 我现在有我的代码了。在我的帖子中看到它作为编辑。谢谢
  • 将此行移到 if 条件外 span = span.AddDays(1);
【解决方案3】:

有很多更有效的方法可以长时间执行此操作,但如果您的代码只处理较小的值,您可以使用:

static DateTime AddDaysExcludingWeekends(DateTime start, int days)
{
    // Do you need this?
    if (days < 0)
    {
        throw new ArgumentException("Not implemented yet...");
    }
    DateTime current = start;
    for (int i = 0; i < days; days++)
    {
        current = current.AddDays(1);
        if (current.DayOfWeek == DayOfWeek.Sunday ||
            current.DayOfWeek == DayOfWeek.Saturday)
        {
            // Effectively force "go round again" behaviour.
            i--;
        }
    }
    return current;
}

或者另一种方法:

static DateTime AddDaysExcludingWeekends(DateTime start, int days)
{
    // Do you need this?
    if (days < 0)
    {
        throw new ArgumentException("Not implemented yet...");
    }
    DateTime current = start;
    for (int i = 0; i < days; days++)
    {
        // Loop at least once, and keep going until we're on
        // a weekday.
        do
        {
           current = current.AddDays(1);
        }
        while (current.DayOfWeek == DayOfWeek.Sunday ||
               current.DayOfWeek == DayOfWeek.Saturday);
    }
    return current;
}

请注意,如果您传入 days=0,即使是在周末,也会返回原始日期。目前尚不清楚您是否想要这种行为,或者是否应该跳到星期一。

【讨论】:

    【解决方案4】:
      This is your code... Try.. 
    
            int days = 0;
            DateTime deyt = DateTime.Now;
            DateTime dt = deyt.AddDays(int.Parse(textBox3.Text));
    
            DateTime span = deyt;
            while (span <= dt)
            {
                if (span.DayOfWeek != DayOfWeek.Saturday && span.DayOfWeek != DayOfWeek.Sunday)
                {
                    days++;
                    bd.Text = days.ToString();
                    Console.WriteLine(span.ToString("MM/dd/yy"));
                }
                span = span.AddDays(1);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多