Как найти начало недели (как в воскресенье, так и в понедельник), зная только текущее время в C #?
Что-то вроде:
DateTime.Now.StartWeek(Monday);
Используйте метод расширения. Знаете, они ответ на все вопросы! ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Который может быть использован следующим образом:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
dt
это UTC и уже начало недели , например ,2012-09-02 16:00:00Z
которыйMon, 03 Sep 2012 00:00:00
по местному времени. Так что нужно конвертироватьdt
в местное время или сделать что-то более умное. Также необходимо будет вернуть результат в формате UTC, если вход был UTC.DateTime.Parse("2012-09-02 16:00:00Z")
возвращает эквивалент по местному времени, и этот метод правильно возвращает то же время, что и местное время. Если вы используетеDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
явную передачу времени UTC, этот метод корректно возвращает 6 дней, 16 часов раньше, как время UTC. Это работает именно так, как я ожидал.dt
. Я использовалint diff = dt.Date.DayOfWeek - startOfWeek;
Самый быстрый способ, которым я могу придумать это:
Если вы хотите, чтобы любой другой день недели был вашей начальной датой, все, что вам нужно сделать, это добавить значение DayOfWeek в конец
источник
Немного более многословно и с учетом культуры:
источник
CultureInfo.CurrentCulture
вместо того, чтобы вытягивать ее из темы. Похоже, странный способ получить к нему доступ.Now
имущество дважды. Если между двумя вызовами текущее время пройдет 24:00 (или 12:00 полночь), дата изменится.Использование Fluent DateTime :
источник
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Уродливо, но это, по крайней мере, дает правильные даты
С началом недели, установленным системой:
Без:
источник
Давайте объединим ответ, безопасный для культуры, и ответ метода расширения:
источник
dt
вместоDateTime.Today
, чтобы обернуть математику в,(offset + 7) % 7
чтобы гарантировать отрицательное смещение, использовать перегрузку метода с одним параметром, которая передает текущую культуру вFirstDayOfWeek
качествеstartOfWeek
аргумента, и, возможно (в зависимости от спецификации), чтобы привести смещение нуля до 7-дневного смещения, так что «последний вторник» не возвращается сегодня, если это уже вторник.Это даст вам предыдущее воскресенье (я думаю):
источник
Это может быть немного хакерским, но вы можете привести свойство .DayOfWeek к int (это enum и поскольку его базовый тип данных не изменился, по умолчанию используется int) и использовать его для определения предыдущего начала недели. ,
Похоже, что неделя, указанная в перечислении DayOfWeek, начинается в воскресенье, поэтому, если мы вычтем 1 из этого значения, оно будет равно числу дней, в которые понедельник находится перед текущей датой. Нам также нужно сопоставить воскресенье (0) равным 7, поэтому при 1 - 7 = -6 воскресенье сопоставится с предыдущим понедельником: -
Код предыдущего воскресенья проще, так как нам не нужно делать эту настройку:
источник
На понедельник
На воскресенье
источник
источник
Собираем все вместе, с помощью глобализации и позволяем указать первый день недели как часть нашего звонка
источник
источник
Это даст вам полночь в первое воскресенье недели:
Это дает вам первый понедельник в полночь:
источник
попробуйте это в c #. С помощью этого кода вы можете получить как первую дату, так и последнюю дату данной недели. Здесь воскресенье - первый день, а суббота - последний день, но вы можете установить оба дня в соответствии с вашей культурой.
источник
Пробовал несколько, но не решил проблему с неделей, начинающейся в понедельник, в результате чего дал мне грядущий понедельник в воскресенье. Поэтому я немного изменил его и заставил работать с этим кодом:
источник
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Шаг 1: Создайте статический класс
Шаг 2: Используйте этот класс, чтобы получить начальный и конечный день недели
источник
(6 - (dt.DayOfWeek - startOfWeek)) % 7
для меня против модульных тестов, которые я написал.Следующий метод должен вернуть DateTime, который вы хотите. Введите true для воскресенья, являющегося первым днем недели, false для понедельника:
источник
Спасибо за примеры. Мне нужно было всегда использовать «CurrentCulture» в первый день недели, и для массива мне нужно было знать точное число Daynumber .. поэтому вот мои первые расширения:
источник
Кажется, никто еще не ответил правильно. Я вставлю свое решение здесь, на случай, если оно кому-нибудь понадобится. Следующий код работает независимо от того, является ли первый день недели понедельником, воскресеньем или чем-то еще.
источник
Modulo в C # работает плохо для -1mod7 (должно быть 6, c # возвращает -1), так что ... решение "oneliner" для этого будет выглядеть так :)
источник
То же самое в конце недели (в стиле @Compile Это ответ):
источник
Вы можете использовать отличную библиотеку Umbrella :
Однако они , похоже, сохранили понедельник как первый день недели (см. Свойство
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), так что предыдущее локализованное решение немного лучше. Несчастная.Изменить : если присмотреться к вопросу, похоже, что Umbrella на самом деле тоже может сработать:
Хотя стоит отметить, что если вы попросите предыдущий понедельник в понедельник, он вернет вам семь дней назад. Но это также верно, если вы используете
BeginningOfWeek
, что похоже на ошибку :(.источник
Это вернет даты начала и конца недели:
Я разместил полный код для вычисления начала / конца недели, месяца, квартала и года в моем блоге ZamirsBlog
источник
источник
Вот комбинация нескольких ответов. Он использует метод расширения, который позволяет передавать культуру, если она не передана, используется текущая культура. Это даст ему максимальную гибкость и повторное использование.
Пример использования:
источник
если вы хотите, чтобы суббота или воскресенье или любой другой день недели, но не превышали текущую неделю (суббота-воскресенье), я покрою вас этим фрагментом кода.
источник
Нам нравятся строки: получите разницу между первым днем недели текущей культуры и текущим днем, затем вычтите количество дней из текущего дня.
источник
Следуя ответу «Скомпилируйте этот ответ», используйте следующий метод, чтобы получить дату для любого дня недели:
источник
Попробуйте создать функцию, которая использует рекурсию. Ваш объект DateTime является входным параметром, и функция возвращает новый объект DateTime, который обозначает начало недели.
источник
Вычисление таким способом позволяет вам выбрать, какой день недели указывает на начало новой недели (в примере, который я выбрал в понедельник).
Обратите внимание, что выполнение этого расчета для дня, который является понедельником, даст текущий понедельник, а не предыдущий.
источник