2016-03-22 2 views
1

Я новичок в C#, и я использую окна.Как установить datetimepicker в понедельник с настроенным временем?

Я пытаюсь установить 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); 
} 

Кто-нибудь знает, как это сделать? пожалуйста, помогите, спасибо

+0

AddDays (-1). У вас есть DayOfWeek, который равен 2 для вторника и вычитает 1, который равен 1. Таким образом, у вас есть AddDays (1). – jdweng

+0

@ jdweng.извините, я не понимаю, что вы имеете в виду, я уже вычитал 1 из AddDays(), но не работал. Есть идеи? – Kate

+0

Не вычитайте, добавьте число -1. AddDays (-1) – jdweng

ответ

4

Это должно сделать я думаю:

dateTimePicker1.Value = DateTime 
          .Today 
          .AddDays(-(DateTime.Today.DayOfWeek - DayOfWeek.Monday)) 
          .AddHours(10); 

I've made a fiddle

Обратите внимание, что если это называется в воскресенье, он перейдет к следующему понедельнику. Это согласуется с 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); 

Я не могу сделать скрипку из этого, так как dotNetFiddle не позволит изменить культуру, а по умолчанию первый день недели - Sunday, но я тестировал его локально, и он работает.

Это все выше, если ваши требования, что вы указали в вопросе:

Я хочу, чтобы установить понедельник недели я в

Если вместо этого вы хотите (что более вероятно)

Я хочу установить сегодня в 10:00 будет сегодня понедельник, или в противном случае предыдущий понедельник в 10:00"

Который не зависит от того, ваша неделя определяется как начиная с воскресенья, утром, или что-нибудь), то вы можете сделать проще (хотя и менее производительный):

var now = DateTime.Today; 
while(now.DayOfWeek != DayOfWeek.Monday) 
    now = now.AddDays(-1); 
dateTimePicker1.Value = now.AddHours(10); 
+0

Приобретенный, ваш ответ намного лучше моего. :) – Pikoh

+0

@ Jcl, мой календарь для ПК установлен на понедельник в качестве первого дня недели, это вы имеете в виду? также что такое «curDay»? спасибо – Kate

+0

@Kate 'curDay'' 'теперь.DayOfWeek', извините, я делал некоторые тесты, скопировал и вставил без особого внимания. Я отредактировал. И нет, календарь ПК использует разные региональные правила, чем .NET Framework. 'Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek' должен рассказать вам, что ваш первый день недели вашей культуры *** для .NET *** – Jcl

3

Может быть, это то, что вы хотите:

int origin = (int)(DateTime.Today.DayOfWeek) - 1; 
if (origin < 0) origin = 6; 
DateTime.Today.AddDays(-origin).AddHours(10); 
+0

Это будет работать, только если сегодня вторник, не так ли? Я думал, что OP просит «на этой неделе в понедельник в 10:00» независимо от того, что «сегодня» – Jcl

+0

@Jcl '(int) DayOfWeek.Monday' равно 1, так что в основном это то же самое, что и у вас – Pikoh

+0

О да, я читаю это неправильно, вы правы. Извините, что – Jcl

1

Мое решение is

private static DateTime FirstDay(DateTime dateFrom) 
{ 
    dateFrom = dateFrom.AddDays(((int)dateFrom.DayOfWeek) * -1); 
    return new DateTime(dateFrom.Year, dateFrom.Month, dateFrom.Day, 10, 0, 0); 
} 
Смежные вопросы