dotgnu-pnet-commits
[Top][All Lists]
Advanced

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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]