none
Cálculo entre duas datas - Como tratar meses com 28, 30 e 31 dias ? RRS feed

  • Pergunta

  • Boa Tarde!

    Estou pesquisando já a alguns mas não consegui encontrar nada para C# onde seja possível tratar automaticamente ao subtrair do calculo entre duas datas a quantidade de dias exatos considerando que temos meses que tem 28, 30 e 31 dias. Alguém já viu ou faz ideia de como tratar essa situação ?

                #region Realiza o Calculo de Mêses Trabalhados
                DateTime Contratacao = Convert.ToDateTime(txt_data_admissao.Text.ToString());
                DateTime Recisao = Convert.ToDateTime(txt_recisao.Text.ToString());
                TimeSpan dif = Recisao.Subtract(Contratacao);
                int anos = dif.Days / 365;
                int meses = dif.Days / 30;
                int dias = dif.Days;
                MessageBox.Show("Anos: "+anos+" Meses: "+meses+" Dias: "+dias);
                #endregion

    Lembrando que temos anos bissextos e que isso teria que ser "conhecido" pelo sistema também !

    Desde já agradeço! 

    domingo, 14 de junho de 2015 17:03

Respostas

  • Olá,

    Eu criei um exemplo e parece que funcionou bem:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DateTime Contratacao = Convert.ToDateTime("23/02/2013");
                DateTime Recisao = Convert.ToDateTime(DateTime.Now);
                DateTime diff = new DateTime(Recisao.Subtract(Contratacao).Ticks);
                MessageBox.Show("Anos: " + diff.Year + " Meses: " + diff.GetTotalMonths() + " Dias: " + diff.GetTotalDays());
            }
        }
    }
    
    public static class DateTimeExtensions
    {
        public static int GetTotalMonths(this DateTime Source)
        {
            int month = 0;
            DateTime current = Source;
            while (current.Ticks > new DateTime(1, 1, 31).Ticks)
            {
                current = current.AddMonths(-1);
                month += 1;
            }
            return month;
        }
        public static int GetTotalDays(this DateTime Source)
        {
            return Convert.ToInt32(Math.Floor(new TimeSpan(Source.Ticks).TotalDays));
        }
    }

    Veja se é o que você precisa.

    Espero ter ajudado.


    Herbert Lausmann

    domingo, 14 de junho de 2015 18:30