如何获取特定星期中给定日期的日期?

时间:2018-07-07 10:41:35

标签: c# .net datetime

我想获取给定星期几的日期。星期由输入的日期决定。

例如,如果我想要以下日期的星期五:

  1. 06/27/2018
  2. 07/04/2018
  3. 07/07/2018

我希望作为结果:

  1. 06/29/2018
  2. 07/06/2018
  3. 07/06/2018

在这里,周定义为星期一至星期日。

4 个答案:

答案 0 :(得分:4)

您可以基于DayOfWeek通过一些聪明的数学来做到这一点:

public DateTime GetDay(DateTime source, DayOfWeek dayOfWeek, 
    DayOfWeek weekStartsOn = DayOfWeek.Monday)
{
    var offset = (int)source.DayOfWeek - (int)weekStartsOn;;
    if(offset < 0)
    {
        offset = offset + 7;
    }
    return source.AddDays(-offset + (int)dayOfWeek - (int)weekStartsOn);
}

并像这样使用它:

var someDate = ...; //Get a date from somewhere

var friday = GetDay(someDate, DayOfWeek.Friday);
var monday = GetDay(someDate, DayOfWeek.Monday);

如果您的一周从星期日开始,则只需使用可选的第三个参数,例如:

var friday = GetDay(someDate, DayOfWeek.Friday, DayOfWeek.Sunday);

答案 1 :(得分:2)

DavidG答案的当前版本的修改:

static DateTime GetDay(DateTime source, DayOfWeek dayOfWeek)
{
  const int offsetSinceMondayIsFirstDayOfWeek = 7 - (int)DayOfWeek.Monday;
  return source.AddDays(((int)dayOfWeek + offsetSinceMondayIsFirstDayOfWeek) % 7
    - ((int)source.DayOfWeek + offsetSinceMondayIsFirstDayOfWeek) % 7);
}

这考虑到请求者将星期一视为一周的第一天。如果您想将星期六作为一周的第一天,只需将Monday替换为上面的Saturday

在特殊情况下,您将星期日视为一周的第一天,它简化为DavidG的原始方法:

static DateTime GetDay(DateTime source, DayOfWeek dayOfWeek)
{
  return source.AddDays((int)dayOfWeek - (int)source.DayOfWeek);
}

因为BCL的DayOfWeek枚举类型已经在Saturday= 6)和Sunday= 0)之间“环绕”。


http://chartsbin.com/view/41671上有一张世界地图,显然显示了在不同地区中一周中的第一天。

答案 2 :(得分:0)

    public void TestMethod1 ( )
    {

        DateTime date = DateTime.Now;
        DateTime friday = date.AddDays( (int)DayOfWeek.Friday - (int)date.DayOfWeek );
        Console.WriteLine( friday.ToString( ) );

    }

答案 3 :(得分:-4)

   using System;
      using System.Globalization;

   public class Example
   {
      public static void Main()
      {
         DateTime dateValue = new DateTime(2008, 6, 11);
         Console.WriteLine(dateValue.ToString("ddd", 
                           new CultureInfo("fr-FR")));    
      }
   }