/// <summary>
        /// Sets the GregorianCalendar change date. This is the point when the switch
        /// from Julian dates to Gregorian dates occurred. Default is October 15,
        /// 1582. Previous to this, dates will be in the Julian calendar.
        /// <p>
        /// To obtain a pure Julian calendar, set the change date to
        /// <c>Date(Long.MAX_VALUE)</c>. To obtain a pure Gregorian calendar,
        /// set the change date to <c>Date(Long.MIN_VALUE)</c>.
        /// </summary>
        ///
        /// <param name="date">the given Gregorian cutover date.</param>
        /// @stable ICU 2.0
        public void SetGregorianChange(DateTime date)
        {
            gregorianCutover = (date.Ticks / 10000);

            // If the cutover has an extreme value, then create a pure
            // Gregorian or pure Julian calendar by giving the cutover year and
            // JD extreme values.
            if (gregorianCutover <= IBM.ICU.Util.Calendar.MIN_MILLIS)
            {
                gregorianCutoverYear = cutoverJulianDay = Int32.MinValue;
            }
            else if (gregorianCutover >= IBM.ICU.Util.Calendar.MAX_MILLIS)
            {
                gregorianCutoverYear = cutoverJulianDay = Int32.MaxValue;
            }
            else
            {
                // Precompute two internal variables which we use to do the actual
                // cutover computations. These are the Julian day of the cutover
                // and the cutover year.
                cutoverJulianDay = (int)IBM.ICU.Util.Calendar.FloorDivide(gregorianCutover, IBM.ICU.Util.Calendar.ONE_DAY);

                // Convert cutover millis to extended year
                GregorianCalendar cal = new GregorianCalendar(GetTimeZone());
                cal.SetTime(date);
                gregorianCutoverYear = cal.Get(IBM.ICU.Util.Calendar.EXTENDED_YEAR);
            }
        }
示例#2
0
        /// <summary>
        /// Compute the month and date on which this holiday falls in the year
        /// containing the date "date". First figure out which date Easter lands on
        /// in this year, and then add the offset for this holiday to get the right
        /// date.
        /// <p>
        /// The algorithm here is taken from the <a
        /// href="http://www.faqs.org/faqs/calendars/faq/">Calendar FAQ</a>.
        /// </summary>
        ///
        private DateTime ComputeInYear(DateTime date, GregorianCalendar cal)
        {
            if (cal == null)
            {
                cal = calendar;
            }

            lock (cal) {
                cal.SetTime(date);

                int year = cal.Get(IBM.ICU.Util.Calendar.YEAR);
                int g    = year % 19;  // "Golden Number" of year - 1
                int i    = 0;          // # of days from 3/21 to the Paschal full moon
                int j    = 0;          // Weekday (0-based) of Paschal full moon

                if (ILOG.J2CsMapping.Util.DateUtil.After(cal.GetTime(), cal.GetGregorianChange()))
                {
                    // We're past the Gregorian switchover, so use the Gregorian
                    // rules.
                    int c = year / 100;
                    int h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;
                    i = h - (h / 28)
                        * (1 - (h / 28) * (29 / (h + 1)) * ((21 - g) / 11));
                    j = (year + year / 4 + i + 2 - c + c / 4) % 7;
                }
                else
                {
                    // Use the old Julian rules.
                    i = (19 * g + 15) % 30;
                    j = (year + year / 4 + i) % 7;
                }
                int l = i - j;
                int m = 3 + (l + 40) / 44;             // 1-based month in which Easter falls
                int d = l + 28 - 31 * (m / 4);         // Date of Easter within that month

                cal.Clear();
                cal.Set(IBM.ICU.Util.Calendar.ERA, IBM.ICU.Util.GregorianCalendar.AD);
                cal.Set(IBM.ICU.Util.Calendar.YEAR, year);
                cal.Set(IBM.ICU.Util.Calendar.MONTH, m - 1); // 0-based
                cal.Set(IBM.ICU.Util.Calendar.DATE, d);
                cal.GetTime();                               // JDK 1.1.2 bug workaround
                cal.Add(IBM.ICU.Util.Calendar.DATE, daysAfterEaster);

                return(cal.GetTime());
            }
        }
示例#3
0
        public void TestEraStart()
        {
            EthiopicCalendar cal = new EthiopicCalendar(0, 0, 1);
            SimpleDateFormat fmt = new SimpleDateFormat("EEE MMM dd, yyyy GG");

            AssertEquals("Ethiopic Date", "Tue Jan 01, 0000 AD", fmt.FormatObject(cal));

            // The gregorian calendar gets off by two days when
            // the date gets low, unless the gregorian changeover is set to
            // very early. The funny thing is, it's ok for dates in the year
            // 283, but not in the year 7, and it claims to be ok until the year 4.
            // should track down when the dates start to differ...

            IBM.ICU.Util.GregorianCalendar gc = new IBM.ICU.Util.GregorianCalendar();
            gc.SetGregorianChange(ILOG.J2CsMapping.Util.DateUtil.DateFromJavaMillis((Int64.MinValue))); // act like proleptic
            // Gregorian
            gc.SetTime(cal.GetTime());
            AssertEquals("Gregorian Date", "Tue Aug 28, 0007 AD", fmt.FormatObject(gc));
        }
示例#4
0
        public void TestSunriseTimes()
        {
            // logln("Sunrise/Sunset times for San Jose, California, USA");
            // CalendarAstronomer astro = new CalendarAstronomer(-121.55, 37.20);
            // TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");

            // We'll use a table generated by the UNSO website as our reference
            // From: http://aa.usno.navy.mil/
            // -Location: W079 25, N43 40
            // -Rise and Set for the Sun for 2001
            // -Zone: 4h West of Greenwich
            int[] USNO = { 6,  59, 19, 45,  6, 57, 19, 46,  6, 56, 19, 47,  6, 54, 19,
                           48,  6, 52, 19, 49,  6, 50, 19, 51,  6, 48, 19, 52,  6, 47, 19, 53,
                           6,  45, 19, 54,  6, 43, 19, 55,  6, 42, 19, 57,  6, 40, 19, 58,  6,
                           38, 19, 59,  6, 36, 20,  0,  6, 35, 20,  1,  6, 33, 20,  3,  6, 31,
                           20,  4,  6, 30, 20,  5,  6, 28, 20,  6,  6, 27, 20,  7,  6, 25, 20,8,
                           6,  23, 20, 10,  6, 22, 20, 11,  6, 20, 20, 12,  6, 19, 20, 13,  6,
                           17, 20, 14,  6, 16, 20, 16,  6, 14, 20, 17,  6, 13, 20, 18,  6, 11,
                           20, 19, };

            Logln("Sunrise/Sunset times for Toronto, Canada");
            CalendarAstronomer astro = new CalendarAstronomer(-(79 + 25 / 60),
                                                              43 + 40 / 60);

            // As of ICU4J 2.8 the ICU4J time zones implement pass-through
            // to the underlying JDK. Because of variation in the
            // underlying JDKs, we have to use a fixed-offset
            // SimpleTimeZone to get consistent behavior between JDKs.
            // The offset we want is [-18000000, 3600000] (raw, dst).
            // [aliu 10/15/03]

            // TimeZone tz = TimeZone.getTimeZone("America/Montreal");
            IBM.ICU.Util.TimeZone tz = new SimpleTimeZone(-18000000 + 3600000, "Montreal(FIXED)");

            IBM.ICU.Util.GregorianCalendar cal  = new IBM.ICU.Util.GregorianCalendar(tz, Locale.US);
            IBM.ICU.Util.GregorianCalendar cal2 = new IBM.ICU.Util.GregorianCalendar(tz, Locale.US);
            cal.Clear();
            cal.Set(IBM.ICU.Util.Calendar.YEAR, 2001);
            cal.Set(IBM.ICU.Util.Calendar.MONTH, IBM.ICU.Util.Calendar.APRIL);
            cal.Set(IBM.ICU.Util.Calendar.DAY_OF_MONTH, 1);
            cal.Set(IBM.ICU.Util.Calendar.HOUR_OF_DAY, 12); // must be near local noon for
            // getSunRiseSet to work

            IBM.ICU.Text.DateFormat df = IBM.ICU.Text.DateFormat.GetTimeInstance(cal, IBM.ICU.Text.DateFormat.MEDIUM,
                                                                                 Locale.US);
            IBM.ICU.Text.DateFormat df2 = IBM.ICU.Text.DateFormat.GetDateTimeInstance(cal, IBM.ICU.Text.DateFormat.MEDIUM,
                                                                                      IBM.ICU.Text.DateFormat.MEDIUM, Locale.US);
            IBM.ICU.Text.DateFormat day = IBM.ICU.Text.DateFormat.GetDateInstance(cal, IBM.ICU.Text.DateFormat.MEDIUM,
                                                                                  Locale.US);

            for (int i = 0; i < 30; i++)
            {
                astro.SetDate(cal.GetTime());

                DateTime sunrise = DateUtil.DateFromJavaMillis(astro.GetSunRiseSet(true));
                DateTime sunset  = DateUtil.DateFromJavaMillis(astro.GetSunRiseSet(false));

                cal2.SetTime(cal.GetTime());
                cal2.Set(IBM.ICU.Util.Calendar.SECOND, 0);
                cal2.Set(IBM.ICU.Util.Calendar.MILLISECOND, 0);

                cal2.Set(IBM.ICU.Util.Calendar.HOUR_OF_DAY, USNO[4 * i + 0]);
                cal2.Set(IBM.ICU.Util.Calendar.MINUTE, USNO[4 * i + 1]);
                DateTime exprise = cal2.GetTime();
                cal2.Set(IBM.ICU.Util.Calendar.HOUR_OF_DAY, USNO[4 * i + 2]);
                cal2.Set(IBM.ICU.Util.Calendar.MINUTE, USNO[4 * i + 3]);
                DateTime expset = cal2.GetTime();
                // Compute delta of what we got to the USNO data, in seconds
                int deltarise = Math.Abs((int)((sunrise.Ticks / 10000) - (exprise.Ticks / 10000)) / 1000);
                int deltaset  = Math.Abs((int)((sunset.Ticks / 10000) - (expset.Ticks / 10000)) / 1000);

                // Allow a deviation of 0..MAX_DEV seconds
                // It would be nice to get down to 60 seconds, but at this
                // point that appears to be impossible without a redo of the
                // algorithm using something more advanced than Duffett-Smith.
                int MAX_DEV = 180;
                if (deltarise > MAX_DEV || deltaset > MAX_DEV)
                {
                    if (deltarise > MAX_DEV)
                    {
                        Errln("FAIL: " + day.Format(cal.GetTime()) + ", Sunrise: "
                              + df2.Format(sunrise) + " (USNO "
                              + df.Format(exprise) + " d=" + deltarise + "s)");
                    }
                    else
                    {
                        Logln(day.Format(cal.GetTime()) + ", Sunrise: "
                              + df.Format(sunrise) + " (USNO "
                              + df.Format(exprise) + ")");
                    }
                    if (deltaset > MAX_DEV)
                    {
                        Errln("FAIL: " + day.Format(cal.GetTime()) + ", Sunset: "
                              + df2.Format(sunset) + " (USNO "
                              + df.Format(expset) + " d=" + deltaset + "s)");
                    }
                    else
                    {
                        Logln(day.Format(cal.GetTime()) + ", Sunset: "
                              + df.Format(sunset) + " (USNO " + df.Format(expset)
                              + ")");
                    }
                }
                else
                {
                    Logln(day.Format(cal.GetTime()) + ", Sunrise: "
                          + df.Format(sunrise) + " (USNO " + df.Format(exprise)
                          + ")" + ", Sunset: " + df.Format(sunset) + " (USNO "
                          + df.Format(expset) + ")");
                }
                cal.Add(IBM.ICU.Util.Calendar.DATE, 1);
            }

            // CalendarAstronomer a = new CalendarAstronomer(-(71+5/60), 42+37/60);
            // cal.clear();
            // cal.set(cal.YEAR, 1986);
            // cal.set(cal.MONTH, cal.MARCH);
            // cal.set(cal.DATE, 10);
            // cal.set(cal.YEAR, 1988);
            // cal.set(cal.MONTH, cal.JULY);
            // cal.set(cal.DATE, 27);
            // a.setDate(cal.getTime());
            // long r = a.getSunRiseSet2(true);
        }