Как он мог бы получать в последний понедельник каждого месяца в C#?

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

попробуйте получать полные дни месяца и оставаться 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;
16
задан 19.03.2019, 22:44
5 ответов

Если ты хочешь знать 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

типов Привета

11
ответ дан 02.12.2019, 05:27

Ответы, которые ты получил, используют цикл. Я иду в 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);
16
ответ дан 02.12.2019, 05:27

Способ это делать 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);
}
7
ответ дан 02.12.2019, 05:27

ú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
8
ответ дан 02.12.2019, 05:27

что ты обрезал заставлять обращаться, 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;
}
5
ответ дан 02.12.2019, 05:27

Теги

Похожие вопросы