Filtering by dates - Verification of months 31 and February [closed]

0

I have the following code:

Example code, you should debug and follow the "lstItem" variable to understand its operation

using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace TesteRotina
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> lstItem = new List<Item>
            {
                new Item
                {
                    IdItem = 1,
                    NomeModificador = "ITEM 1",
                    DataUltimaMontagem = new DateTime(2015, 10, 18),
                    DiaMontagem = 18,
                    TipoPeriodicidade = (int) TipoPeriodicidadeEnum.Mensal
                },
                new Item
                {
                    IdItem = 2,
                    NomeModificador = "ITEM 2",
                    DataUltimaMontagem = new DateTime(2015, 10, 31),
                    DiaMontagem = 31,
                    TipoPeriodicidade = (int) TipoPeriodicidadeEnum.Mensal
                },
                new Item
                {
                    IdItem = 3,
                    NomeModificador = "ITEM 3",
                    DataUltimaMontagem = new DateTime(2015, 10, 29),
                    DiaMontagem = 29,
                    TipoPeriodicidade = (int) TipoPeriodicidadeEnum.Mensal
                }
            };

            lstItem = FiltrarListaItem(lstItem);

        }

        private static List<Item> FiltrarListaItem(List<Item> lstItem)
        {
            List<Item> lstRetorno = new List<Item>();
            foreach (var item in lstItem)
            {
                var dataUltimaMontagem = item.DataUltimaMontagem;
                var diaMontagem = item.DiaMontagem;
                var tipoPeriodicidade = item.TipoPeriodicidade;

                switch (tipoPeriodicidade)
                {
                    case (int)TipoPeriodicidadeEnum.Mensal:
                        dataUltimaMontagem = dataUltimaMontagem.AddMonths(1);
                        break;
                    case (int)TipoPeriodicidadeEnum.Bimestral:
                        dataUltimaMontagem = dataUltimaMontagem.AddMonths(2);
                        break;
                    case (int)TipoPeriodicidadeEnum.Trimestral:
                        dataUltimaMontagem = dataUltimaMontagem.AddMonths(3);
                        break;
                    case (int)TipoPeriodicidadeEnum.Semestral:
                        dataUltimaMontagem = dataUltimaMontagem.AddMonths(6);
                        break;
                    case (int)TipoPeriodicidadeEnum.Anual:
                        dataUltimaMontagem = dataUltimaMontagem.AddYears(1);
                        break;
                }

                if (dataUltimaMontagem.Day.Equals(DateTime.Now.Day) && dataUltimaMontagem.Month.Equals(DateTime.Now.Month))
                    lstRetorno.Add(item);
            }

            return lstItem;
        }
    }

    public class Item
    {
        public int IdItem { get; set; }
        public string NomeModificador { get; set; }
        public int TipoPeriodicidade { get; set; }
        public DateTime DataUltimaMontagem { get; set; }
        public int DiaMontagem { get; set; }
    }

    public enum TipoPeriodicidadeEnum
    {
        [Description("Mensal")]
        Mensal = 1,
        [Description("Bimestral")]
        Bimestral = 2,
        [Description("Trimestral")]
        Trimestral = 3,
        [Description("Semestral")]
        Semestral = 4,
        [Description("Anual")]
        Anual = 5
    }
}

In the example, the FiltrarListaItem method removes all items, which have DataMontagem + periodiciodade > DataAtual . Home Ex .:

  

DateInput = 19/10/2015 and Periodicity = Monthly. Home   Date Added + Periodicity = 11/19/2015. This item would   disregarded because the result is greater than the CurrentDate (11/18/2015).

This is a routine that will run every day of the year.

How do I make Mounting Day Items greater than the last day of the month considered and passed through the filter? Home Eg:

  

DiaMontagem = 31 and the month only goes until day 30.
DiaMontagem = 29, 30   or 31 and the month only goes up to 28, as is the case of February.

    
asked by anonymous 18.11.2015 / 14:10

2 answers

5

As I understand it, you need to know what the last day of the month, as you said, was given on the 31st, but the month goes until day 30 etc.

It has a function in DateTime which is < strong> DaysInMonth .

You should pass this method the year and month, which tells you if the month goes until 31, 30, 28, 29

Example

int ultimaDiaMes = DateTime.DaysInMonth(2015, 2); // irá retornar 28
    
18.11.2015 / 16:57
1

You can make ExtesionMethod to its DateTime , if the problem with the date is recurring. Example:

using System.IO;
using System;
using ExtensionMethods;

class Program
{
    static void Main()
    {
        DateTime hoje = DateTime.Now;

        Console.WriteLine(string.Format("Hoje é {0}", hoje));
        Console.WriteLine(string.Format("Último dia é {0}", hoje.LastDayOfThisMonth()));
    }
}

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static DateTime LastDayOfThisMonth(this DateTime date)
        {
            return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
        }
    }   
}
    
18.11.2015 / 17:15