Я нуждаюсь в том, чтобы знать, как он получил бы в последний понедельник каждого месяца, так как в программе, которую я должен делать, в этот последний понедельник каждого месяца я должен производить интерес, но не, как он мог бы вычислять это.
попробуйте получать полные дни месяца и оставаться 7 дней, но очевидно результат не всегда будет понедельником.
DateTime fechaHoy = (DateTime)fechahoy.Value.Date;
DateTime fechabono = FechaAbono.Value.Date;
int anyo = fechabono.Year;
int mes = fechabono.Month;
int dias = DateTime.DaysInMonth(anyo, mes);
int anyoHoy = fechaHoy.Year;
int mesHoy = fechaHoy.Month;
int diasHoy = DateTime.DaysInMonth(anyoHoy, mesHoy);
int totaldiashoy = DateTime.DaysInMonth(anyoHoy, mesHoy);// 31 dias
int totaldias = totaldiashoy - 7;
Если ты хочешь знать número d¦ - в месяца, используй следующий funci¦n:
//Ultimo lunes: retorna valor entero
public int UltimoLunesDelMes(int anio, int mes)
{
var ulimoLunesDelMes = new DateTime(anio, mes, DateTime.DaysInMonth(anio,mes));
//es un loop muy corto no afecta el performance.
while (ulimoLunesDelMes.DayOfWeek != DayOfWeek.Monday)
ulimoLunesDelMes = ulimoLunesDelMes.AddDays(-1);
return ulimoLunesDelMes.Day;
}
//Ejemplo: ultimo lunes de enero del 2019
var diaUltimo = UltimoLunesDelMes(2019, 1); //28
типов Привета
Ответы, которые ты получил, используют цикл. Я иду в añadir одна, которая нет, и ademÃ: s он genérico, чтобы искать любой d¦ - в недели. Просто вычисляется último d¦ - в месяца, и с d¦ - в недели, которая вычисляется, который является предыдущим днем недели, который заинтересует нас.
Это функционирует, потому что enumeraci¦n DayOfWeek распределяет целое число каждому d¦ - в недели, будучи Воскресеньем, 0 и asà - до SÃ: bado, чего 6.
private DateTime ObtenerUltimoDiaSemanaDelMes(int anio,int mes, System.DayOfWeek dia)
{
DateTime ultimoDiaMes = new DateTime(anio, mes, DateTime.DaysInMonth(anio, mes));
int diferencia = ultimoDiaMes.DayOfWeek - dia;
return diferencia> 0 ? ultimoDiaMes.AddDays(-1 * diferencia) : ultimoDiaMes.AddDays(-1 * (7 + diferencia));
}
Способ это называть - следующий:
DateTime ultimoLunes = ObtenerUltimoDiaSemanaDelMes(2019, 12, DayOfWeek.Monday);
DateTime ultimoMiercoles = ObtenerUltimoDiaSemanaDelMes(2019, 12, DayOfWeek.Wednesday);
Способ это делать ser¦ - в сначала получая última неделя месяца, который ты хочешь получить, и después получить понедельник ésa неделю следующей формы:
private DateTime GetLastMondayOfMonth(int year, int month)
{
return FirstDateOfWeekISO8601(year, GetLastWeekOfMonth(year, month));
}
private int GetLastWeekOfMonth(int year, int month)
{
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
//Creamos un DateTime con el año, el mes y los dias totales de ése mes
DateTime dt = new DateTime(year, month, DateTime.DaysInMonth(year, month));
Calendar cal = dfi.Calendar;
//Obtenemos la semana de la fecha creada anteriormente
return cal.GetWeekOfYear(dt, dfi.CalendarWeekRule,
dfi.FirstDayOfWeek);
}
public static DateTime FirstDateOfWeekISO8601(int year, int weekOfYear)
{
DateTime jan1 = new DateTime(year, 1, 1);
int daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek;
// Usamos el primer Lunes de Enero para obtener la primera semana del año que no sea la semana 52/53/54 del año anterior
DateTime firstThursday = jan1.AddDays(daysOffset);
var cal = CultureInfo.CurrentCulture.Calendar;
int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
var weekNum = weekOfYear;
// Como estamos agregando días a una fecha en la semana 1,
// debemos restar 1 para obtener la fecha correcta para la semana # 1
if (firstWeek == 1)
{
weekNum -= 1;
}
// Usar el primer Jueves como semana de inicio garantiza que comencemos en el año correcto
// luego sumamos el número de semanas multiplicado por días.
var result = firstThursday.AddDays(weekNum * 7);
// Restamos 3 dias al Jueves para obtener el Lunes que es el primer dia de la semana segun la ISO8601
return result.AddDays(-3);
}
último понедельник любого месяца ser¦ - в:
fecha.AddDays(-(double)fecha.DayOfWeek + 1);
, Когда fecha
- último d¦ - в месяца (и понимая, что в понедельник он стоит 1
и в воскресенье он стоит 0
). Сейчас твоя проблема состоит в том, чтобы получать último d¦ - в месяца, который такой простой, как идти к первому d¦ - в следующего месяца и уменьшать d¦ - в:
var ultimoDiaEnero = (new DateTime(2019, 2, 1)).AddDays(-1);
, Так что, último в понедельник января 2019 пошел:
var ultimoDiaEnero = (new DateTime(2019, 2, 1)).AddDays(-1);
Console.WriteLine(ultimoDiaEnero.AddDays(-(double)ultimoDiaEnero.DayOfWeek + 1));
Предыдущий c¦digo показывает:
1/28/2019 12:00:00 AM
что ты обрезал заставлять обращаться, d¦-схвати их к atrÃ: s ( из-за cuesti¦n эффективности ) и первый понедельник, который ты находишь, - твой último в понедельник месяца:
public DateTime? ObtenerUltimoLunesDelMes(int anyo, int mes)
{
var diasEnElMes = DateTime.DaysInMonth(anyo, mes);
for (int dia = diasEnElMes; dia > 0; dia--)
{
DateTime actual = new DateTime(anyo, mes, dia);
if (actual.DayOfWeek == DayOfWeek.Monday)
return actual;
}
return null;
}