如何使用自定义时间将 datetimepicker 设置为星期一?

Kat*_*ate 1 c#

我是 C# 新手,我正在使用 Windows 窗体。

我正在尝试将单击按钮datetimepicker的时间设置为星期一(一周的第一天)10:00:00。我的意思是无论我想要哪一天,当我单击按钮时,datetimepicker都会转到同一周的星期一,时间为10:00:00

例如,现在的日期时间是22/3/2016 11:15:00我想将其设置为同一周(即昨天)的星期一上午 10 点的日期 =21/3/2016 10:00:00

我试过这段代码,但它去哪了23/3/2016 10:00:00是明天。

private void button1_Click(object sender, EventArgs e)
{
    dateTimePicker1.Value = 
      DateTime.Today.AddDays((int)DateTime.Today.DayOfWeek - 1).AddHours(10);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道怎么做?请帮忙,谢谢

Jcl*_*Jcl 5

我认为应该这样做:

dateTimePicker1.Value = DateTime
                          .Today
                          .AddDays(-(DateTime.Today.DayOfWeek - DayOfWeek.Monday))
                          .AddHours(10);
Run Code Online (Sandbox Code Playgroud)

我做了一个小提琴

请注意,如果在周日调用,它将转到下周一。这与CultureInfo在大多数情况下,星期日被视为一周的第一天的情况一致。

如果您想使用当前文化来解释它(如果该文化说第一天是星期一),您可以执行以下操作:

var now = DateTime.Today;
var firstDayOfWeek = Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
if (now.DayOfWeek == DayOfWeek.Sunday && firstDayOfWeek != DayOfWeek.Sunday)
  now = now.AddDays(-1);
dateTimePicker1.Value = now.AddDays(-(now.DayOfWeek - DayOfWeek.Monday))
                           .AddHours(10);
Run Code Online (Sandbox Code Playgroud)

我无法解决这个问题,因为dotNetFiddle不允许改变文化,默认的一周的第一天为Sunday,但我已经在本地测试过它并且可以正常工作。

以上所有内容是如果您的要求是您在问题中指定的内容:

我想设置我所在的一周中的星期一

如果你想要(更有可能)

我想设置今天上午 10:00 是今天是星期一,否则是前一个星期一的 10:00”

这不取决于您的一周是否被定义为从星期日、早上或其他任何时间开始),那么您可以做更简单的事情(尽管性能较低):

var now = DateTime.Today;
while(now.DayOfWeek != DayOfWeek.Monday)
  now = now.AddDays(-1);
dateTimePicker1.Value = now.AddHours(10);
Run Code Online (Sandbox Code Playgroud)