Avatar billede bumle90 Nybegynder
14. september 2004 - 13:24 Der er 10 kommentarer

antal mdr og dage

Findes der ikke en indbygget metode der kan finde et interval mellem 2 datoer. Der skal retuneres antallet af mdr. samt dage mellem de 2 datoer. Der skal selvfølgelig tages højde for skudår og varierende månedslængde. Jeg har selv lavet en metode som jeg ikke selv synes er særlig skudsikker da jeg ikke tager højde for skudår.
Den ser således ud:

        private static int[] doMonthDiff(DateTime start,DateTime end)
        {
            System.TimeSpan TS =new TimeSpan(end.Ticks-start.Ticks);
            int days=TS.Days;
            if(days<=0)
                return(new int[]{0,0});
            int longMon=31;
            int shortMon=30;
            int months=0;
           
            do
            {
                if(months%2==start.Month%2)
                    days-=shortMon;
                else
                    days-=longMon;
                months++;
            }while((months%2==0 && days>longMon) || (months%2==1 && days>shortMon));
            return(new int[]{months,days});

        }
Avatar billede arne_v Ekspert
14. september 2004 - 14:22 #1
Prøv:

if(end.Day > start.Day)
{
  months = end.Month - start.Month;
  days = end.Day - start.Day;
}
else
{
  months = end.Month - start.Month - 1;
  days = end.Day - start.Day + DateTime.DaysInMonth(start.Year, start.Month);
}
Avatar billede arne_v Ekspert
14. september 2004 - 14:22 #2
(ikke testet)
Avatar billede nielsbrinch Nybegynder
14. september 2004 - 15:25 #3
Man kan trække to TimeSpan's fra hinanden.

TimeSpan foer = new TimeSpan(10000);
TimeSpan efter = new TimeSpan(30000);
TimeSpan imellem = efter - foer;
Avatar billede arne_v Ekspert
14. september 2004 - 21:52 #4
Nu har jeg testet og det ser ud til at virke:

using System;

class MainClass
{
    public static int[] doMonthDiff(DateTime start,DateTime end)
    {
        int months;
        int days;
        if(end.Day > start.Day)
        {
            months = end.Month - start.Month;
            days = end.Day - start.Day;
        }
        else
        {
            months = end.Month - start.Month - 1;
            days = end.Day - start.Day + DateTime.DaysInMonth(start.Year, start.Month);
        }       
        return(new int[]{months,days});
    }
    public static void Main(string[] args)
    {
        int[] tst1 = doMonthDiff(new DateTime(2004, 8, 14), new DateTime(2004, 9, 15));
        Console.WriteLine(tst1[0] + " " + tst1[1]);
        int[] tst2 = doMonthDiff(new DateTime(2004, 8, 14), new DateTime(2004, 9, 13));
        Console.WriteLine(tst2[0] + " " + tst2[1]);
        int[] tst3 = doMonthDiff(new DateTime(2004, 2, 20), new DateTime(2004, 3, 20));
        Console.WriteLine(tst3[0] + " " + tst3[1]);
        int[] tst4 = doMonthDiff(new DateTime(2005, 2, 20), new DateTime(2005, 3, 20));
        Console.WriteLine(tst4[0] + " " + tst4[1]);
    }
}

output:

1 1
0 30
0 29
0 28
Avatar billede arne_v Ekspert
14. september 2004 - 21:53 #5
Det skal naturligvis udvides for at kunne håndtere år. Men den samme logik
må kunne bruges.
Avatar billede stefan_v Nybegynder
17. september 2004 - 09:54 #6
Jeg ville nok kigge lidt ind til TimeSpans... Det er det de gør...
Avatar billede arne_v Ekspert
17. september 2004 - 09:58 #7
Kan du få timespan til at håndtere måneder med forskellig længde og
skudår ?
Avatar billede arne_v Ekspert
19. september 2004 - 18:37 #8
og et svar fra mig
Avatar billede arne_v Ekspert
27. september 2004 - 00:27 #9
bumle ?
Avatar billede stefan_v Nybegynder
14. september 2006 - 14:42 #10
bumle? Lukkes?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester