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});
}
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);
}
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