[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization HijriCal
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization HijriCalendar.cs, 1.2, 1.3 |
Date: |
Fri, 22 Aug 2003 02:21:54 -0400 |
Update of /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Globalization
In directory subversions:/tmp/cvs-serv14259/runtime/System/Globalization
Modified Files:
HijriCalendar.cs
Log Message:
Implement the missing HijriCalendar class.
Index: HijriCalendar.cs
===================================================================
RCS file:
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Globalization/HijriCalendar.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** HijriCalendar.cs 23 Apr 2003 05:39:49 -0000 1.2
--- HijriCalendar.cs 22 Aug 2003 06:21:52 -0000 1.3
***************
*** 24,27 ****
--- 24,28 ----
using System;
+ using Microsoft.Win32;
public class HijriCalendar : Calendar
***************
*** 32,44 ****
// Useful constants.
private const int DefaultTwoDigitMax = 1451;
// Internal state.
private int adjustment;
// Constructor.
- [TODO]
public HijriCalendar()
{
! // TODO
}
--- 33,66 ----
// Useful constants.
private const int DefaultTwoDigitMax = 1451;
+ private const int MaxYear = 9666;
+ private const long MinTicks = 196130592000000000L; // 622-07-08
// Internal state.
private int adjustment;
+ // Number of days in each month of the year. The last month will
+ // have 30 days in a leap year.
+ private static readonly int[] daysInMonth =
+ {30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29};
+
+ // Number of days before each month.
+ private static readonly int[] daysBeforeMonth =
+ {0,
+ 30,
+ 30 + 29,
+ 30 + 29 + 30,
+ 30 + 29 + 30 + 29,
+ 30 + 29 + 30 + 29 + 30,
+ 30 + 29 + 30 + 29 + 30 + 29,
+ 30 + 29 + 30 + 29 + 30 + 29 + 30,
+ 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29,
+ 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29 + 30,
+ 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29,
+ 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29 + 30 + 29 + 30};
+
// Constructor.
public HijriCalendar()
{
! adjustment = 0x0100;
}
***************
*** 54,68 ****
}
! // Get or set the Hijri adjustment value.
! [TODO]
public int HijriAdjustment
{
get
{
return adjustment;
}
set
{
! // TODO: validate the adjustment value
adjustment = value;
}
--- 76,137 ----
}
! // Get or set the Hijri adjustment value, which shifts the
! // date forward or back by up to two days.
public int HijriAdjustment
{
get
{
+ if(adjustment == 0x0100)
+ {
+ #if CONFIG_WIN32_SPECIFICS
+ // Inspect the registry to get
the adjustment value.
+ adjustment = 0;
+ try
+ {
+ RegistryKey key =
Registry.CurrentUser;
+ key = key.OpenSubKey
+ ("Control
Panel\\International", false);
+ if(key != null)
+ {
+ Object value =
key.GetValue
+
("AddHijriDate", null);
+ key.Close();
+ String str =
null;
+ if(value !=
null)
+ {
+ str =
value.ToString();
+ }
+ if(str != null
&&
+
str.StartsWith("AddHijriDate"))
+ {
+ str =
str.Substring(12);
+
if(str.Length > 0)
+ {
+
int ivalue = Int32.Parse(str);
+
if(ivalue >= -2 && ivalue <= 2)
+
{
+
adjustment = ivalue;
+
}
+ }
+ }
+ }
+ }
+ catch(Exception)
+ {
+ // Ignore registry
access errors.
+ }
+ #else
+ adjustment = 0;
+ #endif
+ }
return adjustment;
}
set
{
! if(value < -2 || value > 2)
! {
! throw new
ArgumentOutOfRangeException
! ("value",
_("ArgRange_HijriAdjustment"));
! }
adjustment = value;
}
***************
*** 88,92 ****
set
{
! if(value < 100 || value > 9999)
{
throw new
ArgumentOutOfRangeException
--- 157,161 ----
set
{
! if(value < 100 || value > MaxYear)
{
throw new
ArgumentOutOfRangeException
***************
*** 97,147 ****
}
// Add a time period to a DateTime value.
- [TODO]
public override DateTime AddMonths(DateTime time, int months)
{
! // TODO
! return time;
}
public override DateTime AddYears(DateTime time, int years)
{
! // TODO
! return time;
}
// Extract the components from a DateTime value.
- [TODO]
public override int GetDayOfMonth(DateTime time)
{
! // TODO
! return 0;
}
- [TODO]
public override System.DayOfWeek GetDayOfWeek(DateTime time)
{
! // TODO
! return DayOfWeek.Sunday;
}
- [TODO]
public override int GetDayOfYear(DateTime time)
{
! // TODO
! return 0;
}
- [TODO]
public override int GetMonth(DateTime time)
{
! // TODO
! return 0;
}
- [TODO]
public override int GetYear(DateTime time)
{
! // TODO
! return 0;
}
// Get the number of days in a particular month.
- [TODO]
public override int GetDaysInMonth(int year, int month, int era)
{
--- 166,326 ----
}
+ // Convert a year value into an absolute number of days.
+ private long YearToDays(int year)
+ {
+ int cycle = ((year - 1) / 30) * 30;
+ int left = year - cycle - 1;
+ long days = ((cycle * 10631L) / 30L) + 227013L;
+ while(left > 0)
+ {
+ days += GetDaysInYear(left, HijriEra);
+ --left;
+ }
+ return days;
+ }
+
+ // Pull apart a DateTime value into year, month, and day.
+ private void PullDateApart(DateTime time, out int year,
+ out int month, out
int day)
+ {
+ long days;
+ long estimate1;
+ long estimate2;
+
+ // Validate the time range.
+ if(time.Ticks < MinTicks)
+ {
+ throw new ArgumentOutOfRangeException
+ ("time",
_("ArgRange_HijriDate"));
+ }
+
+ // Calculate the absolute date, adjusted as
necessary.
+ days = (time.Ticks / TimeSpan.TicksPerDay) + 1;
+ days += HijriAdjustment;
+
+ // Calculate the Hijri year value.
+ year = (int)(((days - 227013) * 30) / 10631) +
1;
+ estimate1 = YearToDays(year);
+ estimate2 = GetDaysInYear(year, HijriEra);
+ if(days < estimate1)
+ {
+ estimate1 -= estimate2;
+ --year;
+ }
+ else if(days == estimate1)
+ {
+ --year;
+ estimate2 = GetDaysInYear(year,
HijriEra);
+ estimate1 -= estimate2;
+ }
+ else if(days > (estimate1 + estimate2))
+ {
+ estimate1 += estimate2;
+ ++year;
+ }
+
+ // Calculate the Hijri month value.
+ month = 1;
+ days -= estimate1;
+ while(month <= 12 && days >
daysBeforeMonth[month - 1])
+ {
+ ++month;
+ }
+ --month;
+
+ // Calculate the Hijri date value.
+ day = (int)(days - daysBeforeMonth[month - 1]);
+ }
+
+ // Recombine a DateTime value from its components.
+ private DateTime RecombineDate(int year, int month, int day, long ticks)
+ {
+ int limit = GetDaysInMonth(year, month,
HijriEra);
+ if(day < 1 || day > limit)
+ {
+ throw new ArgumentOutOfRangeException
+ ("day", _("ArgRange_Year"));
+ }
+ long days;
+ days = YearToDays(year) + daysBeforeMonth[month
- 1] + day;
+ days -= (HijriAdjustment + 1);
+ if(days < 0)
+ {
+ throw new ArgumentOutOfRangeException
+ ("time",
_("ArgRange_HijriDate"));
+ }
+ return new DateTime(days * TimeSpan.TicksPerDay
+ ticks);
+ }
+
// Add a time period to a DateTime value.
public override DateTime AddMonths(DateTime time, int months)
{
! int year, month, day;
! PullDateApart(time, out year, out month, out
day);
! if(months > 0)
! {
! year += months / 12;
! month += months % 12;
! if(month > 12)
! {
! ++year;
! month -= 12;
! }
! }
! else if(months < 0)
! {
! months = -months;
! year -= months / 12;
! month -= months % 12;
! if(month < 1)
! {
! --year;
! month += 12;
! }
! }
! int limit = GetDaysInMonth(year, month,
HijriEra);
! if(day > limit)
! {
! day = limit;
! }
! return RecombineDate(year, month, day,
!
time.Ticks % TimeSpan.TicksPerDay);
}
public override DateTime AddYears(DateTime time, int years)
{
! return AddMonths(time, years * 12);
}
// Extract the components from a DateTime value.
public override int GetDayOfMonth(DateTime time)
{
! int year, month, day;
! PullDateApart(time, out year, out month, out
day);
! return day;
}
public override System.DayOfWeek GetDayOfWeek(DateTime time)
{
! return time.DayOfWeek;
}
public override int GetDayOfYear(DateTime time)
{
! int year, month, day;
! PullDateApart(time, out year, out month, out
day);
! return daysBeforeMonth[month - 1] + day;
}
public override int GetMonth(DateTime time)
{
! int year, month, day;
! PullDateApart(time, out year, out month, out
day);
! return month;
}
public override int GetYear(DateTime time)
{
! int year, month, day;
! PullDateApart(time, out year, out month, out
day);
! return year;
}
// Get the number of days in a particular month.
public override int GetDaysInMonth(int year, int month, int era)
{
***************
*** 150,155 ****
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! // TODO
! return 0;
}
--- 329,354 ----
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! if(year < 1 || year > MaxYear)
! {
! throw new ArgumentOutOfRangeException
! ("year", _("ArgRange_Year"));
! }
! if(month < 1 || month > 12)
! {
! throw new ArgumentOutOfRangeException
! ("month", _("ArgRange_Month"));
! }
! if(month < 12)
! {
! return daysInMonth[month - 1];
! }
! else if(IsLeapYear(year, era))
! {
! return 30;
! }
! else
! {
! return 29;
! }
}
***************
*** 157,171 ****
public override int GetDaysInYear(int year, int era)
{
! if(year < 1 || year > 9999)
{
! throw new ArgumentOutOfRangeException
! ("year", _("ArgRange_Year"));
}
! if(era != CurrentEra && era != HijriEra)
{
! throw new
ArgumentException(_("Arg_InvalidEra"));
}
- // TODO
- return 365;
}
--- 356,367 ----
public override int GetDaysInYear(int year, int era)
{
! if(IsLeapYear(year, era))
{
! return 355;
}
! else
{
! return 354;
}
}
***************
*** 179,183 ****
public override int GetMonthsInYear(int year, int era)
{
! if(year < 1 || year > 9999)
{
throw new ArgumentOutOfRangeException
--- 375,379 ----
public override int GetMonthsInYear(int year, int era)
{
! if(year < 1 || year > MaxYear)
{
throw new ArgumentOutOfRangeException
***************
*** 188,197 ****
throw new
ArgumentException(_("Arg_InvalidEra"));
}
- // TODO
return 12;
}
// Determine if a particular day is a leap day.
- [TODO]
public override bool IsLeapDay(int year, int month, int day, int era)
{
--- 384,391 ----
***************
*** 201,210 ****
("day", _("ArgRange_Day"));
}
! // TODO
! return false;
}
// Determine if a particular month is a leap month.
- [TODO]
public override bool IsLeapMonth(int year, int month, int era)
{
--- 395,409 ----
("day", _("ArgRange_Day"));
}
! if(IsLeapMonth(year, month, era))
! {
! return (day == 30);
! }
! else
! {
! return false;
! }
}
// Determine if a particular month is a leap month.
public override bool IsLeapMonth(int year, int month, int era)
{
***************
*** 214,226 ****
("month", _("ArgRange_Month"));
}
! // TODO
! return false;
}
// Determine if a particular year is a leap year.
- [TODO]
public override bool IsLeapYear(int year, int era)
{
! if(year < 1 || year > 9999)
{
throw new ArgumentOutOfRangeException
--- 413,430 ----
("month", _("ArgRange_Month"));
}
! if(IsLeapYear(year, era))
! {
! return (month == 12);
! }
! else
! {
! return false;
! }
}
// Determine if a particular year is a leap year.
public override bool IsLeapYear(int year, int era)
{
! if(year < 1 || year > MaxYear)
{
throw new ArgumentOutOfRangeException
***************
*** 231,240 ****
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! // TODO
! return false;
}
// Convert a particular time into a DateTime value.
- [TODO]
public override DateTime ToDateTime(int year, int month, int day,
int hour, int minute, int second,
--- 435,449 ----
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! if((((year * 11) + 14) % 30) < 11)
! {
! return true;
! }
! else
! {
! return false;
! }
}
// Convert a particular time into a DateTime value.
public override DateTime ToDateTime(int year, int month, int day,
int hour, int minute, int second,
***************
*** 245,251 ****
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! // TODO
! return new DateTime(year, month, day, hour,
! minute,
second, millisecond);
}
--- 454,460 ----
throw new
ArgumentException(_("Arg_InvalidEra"));
}
! return RecombineDate(year, month, day,
! (new
TimeSpan(hour, minute, second,
!
millisecond)).Ticks);
}
***************
*** 253,256 ****
--- 462,470 ----
public override int ToFourDigitYear(int year)
{
+ if(year > MaxYear)
+ {
+ throw new ArgumentOutOfRangeException
+ ("year", _("ArgRange_Year"));
+ }
return base.ToFourDigitYear(year);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization HijriCalendar.cs, 1.2, 1.3,
Rhys Weatherley <address@hidden> <=