Я просматривал документы Microsoft и множество сообщений о переполнении стека, но, похоже, ни один из них не отвечает на мой вопрос. Я хочу знать самый простой и легкий способ получить точный номер недели для текущей даты в С#. Я довольно новичок в С#, поэтому, пожалуйста, старайтесь не усложнять. Я пробовал использовать:
int week = DateTime.Now.DayOfYear/7;
Console.WriteLine(week)
но в понедельник (когда я хотел бы, чтобы он перешел на следующую неделю) он будет отображаться как предыдущая неделя. Например: если бы дата была 21.12.2020, то текущая неделя — 50-я, то есть через 2 недели. Затем 22.12.2020 будет сказано, что это 51-я неделя, что составляет 1 неделю.
Пожалуйста, помогите и спасибо заранее.
Но для недели года по ISO вы можете использовать learn.microsoft.com/en-us/dotnet/api/…
Вы, кажется, не принимаете во внимание тот факт, что 1 января не всегда понедельник
Отвечает ли это на ваш вопрос? Получить правильный номер недели для заданной даты
Вероятно, это то, что вы ищете:
DateTime dt = new DateTime(2020, 12, 21);
Calendar cal = new CultureInfo("en-US").Calendar;
int week = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
Console.WriteLine(week);
Вы можете изменить параметр CalendarWeekRule
, чтобы изменить определение первой недели года:
FirstDay
означает, что первая неделя года может иметь любую длину. Например, если первым днем года было воскресенье, оно будет считаться неделей, а следующий понедельник будет считаться частью второй недели.
FirstFourDayWeek
означает, что первая неделя будет учитываться только в том случае, если она в основном приходится на этот год. Например, если первым днем года будет четверг, неделя будет учитываться, но если год начинается с пятницы, первая неделя не будет учитываться.
FirstFullWeek
означает, что первая неделя, которая будет учитываться, будет первой полной неделей года.
Предлагаемое ниже решение (построенное на этом) принимает правила указанной культуры вместо того, чтобы объявлять их самостоятельно
Есть ли способ или правило получить номер недели указанного месяца?
@RubioJesús Я не думаю, что есть правило, но вы можете рассчитать его, вычтя номер недели первого дня этого месяца из номера недели дня (week
, cal
и dt
такие же, как в ответе) : week - cal.GetWeekOfYear(new DateTime(dt.Year, dt.Month, 1), ...) + 1
. +1
есть так, что первая неделя в месяце имеет номер 1, а не 0.
Я тоже смотрел на это, когда писал приложение в LotusNotes. Из того, что я обнаружил, первая неделя года должна содержать четверг. Если вы предполагаете, что воскресенье является последним днем недели, то самая низкая дата для воскресенья должна быть 4-го числа. Имея это в виду (и я очень новичок в C# и во всех тонкостях), я написал этот код, который даст вам номер недели любой заданной даты, а также количество недель в этом году и в предыдущем. #
public class DateCalculations
{
private readonly DateTime _weekDate;
private DateTime ThisSunday => GetSundayDate(_weekDate);
private DateTime FirstDay_ThisYear => DateTime.Parse($"01/01/{ ThisSunday.Year }");
private DateTime FirstDay_LastYear => DateTime.Parse($"01/01/{ ThisSunday.Year - 1 }");
private DateTime FirstDay_NextYear => DateTime.Parse($"01/01/{ ThisSunday.Year + 1 }");
private DateTime FirstSunday_ThisYear => GetSundayDate_WeekOne(FirstDay_ThisYear);
private DateTime FirstSunday_LastYear => GetSundayDate_WeekOne(FirstDay_LastYear);
private DateTime FirstSunday_NextYear => GetSundayDate_WeekOne(FirstDay_NextYear);
public DateCalculations(string weekDate)
{
if (DateTime.TryParse(weekDate, out _weekDate))
{
return;
}
else
{
throw new Exception("Incorrect date has been supplied");
}
}
private bool IsDateInFirstWeek(DateTime suppliedDate)
{
var output = false;
// First week must contain a Thursday, so lowest Sunday date possible is the 4th
if (suppliedDate.Day >= 4)
{
output = true;
}
return output;
}
private DateTime GetSundayDate(DateTime suppliedDate)
{
var checkDay = suppliedDate;
//Check if the day of the supplied date is a Sunday
while (checkDay.DayOfWeek != DayOfWeek.Sunday)
{
checkDay = checkDay.AddDays(1);
}
return checkDay;
}
private DateTime GetSundayDate_WeekOne(DateTime suppliedDate)
{
var checkDay = GetSundayDate(suppliedDate);
if (IsDateInFirstWeek(checkDay) == false)
{
checkDay = checkDay.AddDays(7);
}
return checkDay;
}
public int WeekNumber()
{
var output = 0;
if (ThisSunday == FirstSunday_ThisYear)
{
output = 1;
}
else if (ThisSunday > FirstSunday_ThisYear)
{
TimeSpan daysBetween = ThisSunday - FirstSunday_ThisYear;
output = (daysBetween.Days/7) + 1;
}
else
{
TimeSpan daysBetween = ThisSunday - FirstSunday_LastYear;
output = (daysBetween.Days / 7) + 1;
}
return output;
}
public int TotalWeeksThisYear()
{
TimeSpan daysBetween = FirstSunday_NextYear - FirstSunday_ThisYear;
return (daysBetween.Days / 7);
}
public int TotalWeeksLastYear()
{
TimeSpan daysBetween = FirstSunday_ThisYear - FirstSunday_LastYear;
return (daysBetween.Days / 7);
}
}
Моя консоль использовалась для тестирования
class Program
{
static void Main()
{
var test = new DateCalculations("2021-01-03");
var weekNumber = test.WeekNumber();
var totalWeeks = test.TotalWeeksThisYear();
var pastWeeks = test.TotalWeeksLastYear();
Console.ReadLine();
}
}
Формат даты может быть любым строковым представлением даты (английским или американским).
Надеюсь это поможет. Хотя, возможно, потребуется рефакторинг :)
Построен на основе этого ответа : от @bunny4
Но не все находятся в США или могут поддерживать несколько культур. Используйте это решение для поддержки культурно определенного правила недели и правила первого дня. В Дании действует правило «FirstFourDayWeek» для недель и «понедельник» в качестве первого дня недели.
//for now, take the the current executing thread's Culture
var cultureInfo = Thread.CurrentThread.CurrentCulture;
//let's pick a date
DateTime dt = new DateTime(2020, 12, 21);
DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
CalendarWeekRule weekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
Calendar cal = cultureInfo.Calendar;
int week = cal.GetWeekOfYear(dt, weekRule, firstDay);
Что именно вы подразумеваете под «номером недели»? Существует множество различных способов определения номеров недель.