rodchar said:
public static int GetWeekNumber(DateTime dtPassed)
{
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed,
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
}
i'd like to make this part of my YearWeek struct. Is it possible to change
this so it will return an instance of YearWeek?
You should add it as a WeekType to th WeekUtil class.
Note though that the above is specifying ISO week, but it
is not working correctly.
See code below.
Arne
=========================
using System;
using System.Globalization;
namespace E
{
public enum WeekType { ISO, WRONGISO };
public static class WeekUtil
{
private static int IsoWeek(int year, int mon, int day)
{
int a = (14 - mon) / 12;
int y = year + 4800 - a;
int m = mon + 12*a - 3;
int JD = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 +
y/400 - 32045;
int d4 = (((JD + 31741 - JD % 7) % 146097) % 36524) % 1461;
int L = d4 / 1460;
int d1 = ((d4 - L) % 365) + L;
return d1 / 7 + 1;
}
private static int WrongIsoWeek(DateTime dt)
{
CultureInfo ci = CultureInfo.CurrentCulture;
return ci.Calendar.GetWeekOfYear(dt,
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
public static YearWeek FromDate(WeekType typ, DateTime dt)
{
int y;
int w;
y = dt.Year;
switch (typ) {
case WeekType.ISO:
w = IsoWeek(dt.Year, dt.Month, dt.Day);
break;
case WeekType.WRONGISO:
w = WrongIsoWeek(dt);
break;
default:
throw new ArgumentOutOfRangeException("Unknown week
type");
}
if(w == 1 && dt.Month == 12) y++;
if(w >= 52 && dt.Month == 1) y--;
return new YearWeek(typ, y, w);
}
public static DateTime ToDate(WeekType typ, YearWeek yw)
{
DateTime dt = new DateTime(yw.Year, 1, 7);
dt = dt.AddDays((yw.Week - FromDate(typ, dt).Week) * 7);
return dt;
}
public static DayInterval ToInterval(WeekType typ, YearWeek yw)
{
DateTime dt = ToDate(typ, yw);
DateTime start = dt;
while (FromDate(typ, start.AddDays(-1)) == yw)
{
start = start.AddDays(-1);
}
DateTime end = dt;
while (FromDate(typ, end.AddDays(1)) == yw)
{
end = end.AddDays(1);
}
end =
end.AddHours(23).AddMinutes(59).AddSeconds(59).AddMilliseconds(999);
return new DayInterval(start, end);
}
}
public struct YearWeek
{
private WeekType typ;
private int y;
private int w;
public int Year { get { return y; } }
public int Week { get { return w;} }
public YearWeek(WeekType typ, int y, int w)
{
this.typ = typ;
this.y = y;
this.w = w;
}
public YearWeek AddWeeks(int n)
{
return WeekUtil.FromDate(typ, WeekUtil.ToDate(typ,
this).AddDays(n * 7));
}
public override string ToString()
{
return Year.ToString("0000") + "w" + Week.ToString("00");
}
public static bool operator==(YearWeek a, YearWeek b)
{
return a.Year == b.Year && a.Week == b.Week;
}
public static bool operator!=(YearWeek a, YearWeek b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return this == (YearWeek)obj;
}
public override int GetHashCode()
{
return y.GetHashCode() ^ w.GetHashCode();
}
}
public struct DayInterval
{
private DateTime start;
private DateTime end;
public DateTime Start { get { return start; } }
public DateTime End { get { return end; } }
public DayInterval(DateTime start, DateTime end)
{
this.start = start;
this.end = end;
}
public override string ToString()
{
return start + "-" + end;
}
}
public class Program
{
public static void Main(string[] args)
{
DateTime dt1 = new DateTime(2003, 12, 31);
Console.WriteLine(dt1);
Console.WriteLine(WeekUtil.FromDate(WeekType.ISO, dt1));
Console.WriteLine(WeekUtil.ToInterval(WeekType.ISO,
WeekUtil.FromDate(WeekType.ISO, dt1)));
Console.WriteLine(WeekUtil.FromDate(WeekType.WRONGISO, dt1));
Console.WriteLine(WeekUtil.ToInterval(WeekType.WRONGISO,
WeekUtil.FromDate(WeekType.WRONGISO, dt1)));
DateTime dt2 = new DateTime(2004, 1, 1);
Console.WriteLine(dt2);
Console.WriteLine(WeekUtil.FromDate(WeekType.ISO, dt2));
Console.WriteLine(WeekUtil.ToInterval(WeekType.ISO,
WeekUtil.FromDate(WeekType.ISO, dt2)));
Console.WriteLine(WeekUtil.FromDate(WeekType.WRONGISO, dt2));
Console.WriteLine(WeekUtil.ToInterval(WeekType.WRONGISO,
WeekUtil.FromDate(WeekType.WRONGISO, dt2)));
Console.ReadKey();
}
}
}