Пример #1
0
        /// <summary>
        /// 获取指定年份春节当日(正月初一)的公历日期
        /// </summary>
        /// <param name="year">指定的年份</param>
        private static DateTime GetLunarNewYearDate(int year)
        {
            ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();
            DateTime dt      = new DateTime(year, 1, 1);
            int      cnYear  = calendar.GetYear(dt);
            int      cnMonth = calendar.GetMonth(dt);

            int num1 = 0;
            int num2 = calendar.IsLeapYear(cnYear) ? 13 : 12;

            while (num2 >= cnMonth)
            {
                num1 += calendar.GetDaysInMonth(cnYear, num2--);
            }

            num1 = num1 - calendar.GetDayOfMonth(dt) + 1;
            return(dt.AddDays(num1));
        }
Пример #2
0
        public override IEnumerable <PublicHoliday> Get(int year)
        {
            //Suriname
            //https://en.wikipedia.org/wiki/Suriname#National_holidays

            var countryCode  = CountryCode.SR;
            var easterSunday = base.EasterSunday(year);

            var thirdSundayInJanuary = DateSystem.FindDay(year, 1, DayOfWeek.Sunday, 1);

            var items = new List <PublicHoliday>();

            items.Add(new PublicHoliday(year, 1, 1, "New Year's Day", "New Year's Day", countryCode));
            items.Add(new PublicHoliday(year, 1, 6, "Three Kings Day", "Three Kings Day", countryCode));
            items.Add(new PublicHoliday(thirdSundayInJanuary, "World Religion Day", "World Religion Day", countryCode));
            items.Add(new PublicHoliday(year, 2, 25, "Day of the Revolution", "Day of the Revolution", countryCode));
            //TODO:Holi
            items.Add(new PublicHoliday(easterSunday.AddDays(-2), "Good Friday", "Good Friday", countryCode));
            items.Add(new PublicHoliday(easterSunday, "Easter", "Easter", countryCode));
            items.Add(new PublicHoliday(year, 5, 1, "Labour Day", "Labour Day", countryCode));
            items.Add(new PublicHoliday(easterSunday.AddDays(39), "Ascension Day", "Ascension Day", countryCode));
            items.Add(new PublicHoliday(year, 6, 5, "Indian Arrival Day", "Indian Arrival Day", countryCode));
            items.Add(new PublicHoliday(year, 7, 1, "Keti Koti", "Keti Koti", countryCode));
            items.Add(new PublicHoliday(year, 8, 8, "Javanese Arrival Day", "Javanese Arrival Day", countryCode));
            items.Add(new PublicHoliday(year, 8, 9, "Indigenous People's Day", "Indigenous People's Day", countryCode));
            items.Add(new PublicHoliday(year, 10, 10, "Day of the Maroons", "Day of the Maroons", countryCode));
            items.Add(new PublicHoliday(year, 10, 20, "Chinese Arrival day", "Chinese Arrival day", countryCode));
            //TODO:Largest festival of Hindus
            items.Add(new PublicHoliday(year, 11, 25, "Independence Day", "Independence Day", countryCode));
            items.Add(new PublicHoliday(year, 12, 25, "Christmas Day", "Christmas Day", countryCode));
            items.Add(new PublicHoliday(year, 12, 26, "Boxing Day", "Boxing Day", countryCode));

            if (year > 1901 && year < 2100)
            {
                //LunisolarCalendar .net implementation only valid are between 1901 and 2100, inclusive.
                //https://github.com/dotnet/coreclr/blob/master/src/mscorlib/shared/System/Globalization/ChineseLunisolarCalendar.cs
                //https://stackoverflow.com/questions/30719176/algorithm-to-find-the-gregorian-date-of-the-chinese-new-year-of-a-certain-gregor
                var chineseCalendar = new ChineseLunisolarCalendar();
                var chineseNewYear  = chineseCalendar.ToDateTime(year, 1, 1, 0, 0, 0, 0);
                items.Add(new PublicHoliday(chineseNewYear, "Chinese New Year", "Chinese New Year", countryCode));
            }

            return(items.OrderBy(o => o.Date));
        }
Пример #3
0
        /// <summary>
        /// Gets Chinese Day<br />
        /// 获得农历日
        /// </summary>
        /// <param name="calendar"></param>
        /// <param name="dt"></param>
        /// <param name="traditionalChineseCharacters"></param>
        /// <returns></returns>
        public static string GetChineseDay(ChineseLunisolarCalendar calendar, DateTime dt, bool traditionalChineseCharacters = false)
        {
            var day  = calendar.GetDayOfMonth(dt);
            var priP = traditionalChineseCharacters ? PRIZ : PRIS;
            var sriP = traditionalChineseCharacters ? SRIZ : SRIS;
            var mriP = traditionalChineseCharacters ? MRIZ : MRIS;

            switch (day)
            {
            case 0:
            case 10:
            case 20:
            case 30:
                return(mriP[day / 10]);

            default:
                return($"{priP[day / 10]}{sriP[day % 10]}");
            }
        }
Пример #4
0
        static int Test()
        {
            int count = 0;
            HashSet <Constellation> constellations = new HashSet <Constellation>(12);
            HashSet <int>           lunisolar      = new HashSet <int>(12);
            Random random = new Random();

            while (constellations.Count < 12 || lunisolar.Count < 12)
            {
                DateTime date = new DateTime(1990, 1, 1);
                date = date.AddDays(random.Next(0, 13148));
                constellations.Add(GetConstellation(date.Month, date.Day));
                ChineseLunisolarCalendar lc = new ChineseLunisolarCalendar();
                lunisolar.Add(lc.GetSexagenaryYear(date) % 12);
                count++;
            }

            return(count);
        }
Пример #5
0
 protected void SetUp()
 {
     gcal  = new GregorianCalendar();
     jucal = new JulianCalendar();
     hical = new HijriCalendar();
     hecal = new HebrewCalendar();
     jacal = new JapaneseCalendar();
     tacal = new TaiwanCalendar();
     kcal  = new KoreanCalendar();
     tbcal = new ThaiBuddhistCalendar();
     acal  = new Calendar[] {
         gcal, jucal, hical, hecal, jacal,
         tacal, kcal, tbcal
     };
     clcal = new ChineseLunisolarCalendar();
     tlcal = new TaiwanLunisolarCalendar();
     jlcal = new JapaneseLunisolarCalendar();
     klcal = new KoreanLunisolarCalendar();
 }
Пример #6
0
        /// <summary>
        /// Gets Chinese Hour<br />
        /// 获得农历时辰
        /// </summary>
        /// <param name="calendar"></param>
        /// <param name="dt"></param>
        /// <param name="traditionalChineseCharacters"></param>
        /// <returns></returns>
        public static string GetChineseHour(ChineseLunisolarCalendar calendar, DateTime dt, bool traditionalChineseCharacters = false)
        {
            var shiP = traditionalChineseCharacters ? SHIZ : SHIS;

            var hour = dt.Hour;

            if (dt.Minute != 0)
            {
                hour += 1;
            }
            var offset = hour / 2;

            if (offset >= 12)
            {
                offset = 0;
            }

            return($"{ZHIS[offset]}{shiP}");
        }
Пример #7
0
        public DateComboBox()
        {
            if (Program.IsRunning)
            {
                var date = DateTime.Now.Date;

                _lunisolarCalendar = new ChineseLunisolarCalendar();
                Items.AddRange(Enumerable.Range(0, 100).Select(s => (object)(DateWrap)date.AddDays(s)).ToArray());

                DrawMode       = DrawMode.OwnerDrawVariable;
                MeasureItem   += DateComboBox_MeasureItem;
                DrawItem      += DateComboBox_DrawItem;
                DropDownHeight = 470;
                DropDownStyle  = ComboBoxStyle.DropDownList;
                DoubleBuffered = true;
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

                RefreshSellStatus();
            }
        }
Пример #8
0
        ///<summary>
        /// 公历转农历
        ///</summary>
        ///<param name="d">公历日期时间</param>
        ///<returns>农历日期</returns>
        public static ChineseLunisolarDate AsChineseDate(this DateTime d)
        {
            try
            {
                ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();
                var year      = calendar.GetYear(d);
                var month     = calendar.GetMonth(d);
                var day       = calendar.GetDayOfMonth(d);
                int leapMonth = calendar.GetLeapMonth(year);
                month = leapMonth > 0 && leapMonth <= month ? month - 1 : month;

                return(new ChineseLunisolarDate {
                    Year = year, Month = month, Day = day
                });
            }
            catch
            {
                throw new BusinessException("公历转换为农历失败");
            }
        }
Пример #9
0
        //公历转农历
        public static DateTime SolarToLunar(this DateTime time)
        {
            ChineseLunisolarCalendar lunarCalendar;
            DateTime solar;
            int      year, month, day;
            int      leapMonth;

            lunarCalendar = new ChineseLunisolarCalendar();
            solar         = time;
            year          = lunarCalendar.GetYear(solar);
            month         = lunarCalendar.GetMonth(solar);
            day           = lunarCalendar.GetDayOfMonth(solar);
            leapMonth     = lunarCalendar.GetLeapMonth(year);
            if (0 < leapMonth && leapMonth <= month)
            {
                --month;
            }
            solar = new DateTime(year, month, day);
            return(solar);
        }
Пример #10
0
        static void Main(string[] args)
        {
            var           lc      = new ChineseLunisolarCalendar();
            DateTime      tdt     = new DateTime(1990, 1, 1);
            StringBuilder builder = new StringBuilder();

            for (int i = 0; i < 365 * 40; ++i)
            {
                tdt = tdt.AddDays(1);
                //Console.WriteLine("-----------------------------------------");
                //Console.WriteLine("Solor::  Year:{0}, Month:{1}, Day:{2}", tdt.Year, tdt.Month, tdt.Day);
                //Console.WriteLine("Lunar::  Year:{0}, Month:{1}, Day:{2}, LeapMonth:{3}", lc.GetYear(tdt),
                //    lc.GetMonth(tdt), lc.GetDayOfMonth(tdt), lc.GetLeapMonth(tdt.Year));
                builder.AppendFormat("{0}-{1}-{2}", tdt.Year, tdt.Month, tdt.Day);
                builder.Append(" ");
                builder.AppendFormat("{0}-{1}-{2}-{3}", lc.GetYear(tdt),
                                     lc.GetMonth(tdt), lc.GetDayOfMonth(tdt), lc.GetLeapMonth(tdt.Year));
                builder.Append("\n");
            }
            System.IO.File.WriteAllText("jqt.test", builder.ToString());
        }
Пример #11
0
        public static void Cultures()
        {
            // These classes won't be linked away because of the code.
            //
            // This is to resolve crash at CultureInfo.CurrentCulture
            // when language is set to Thai. See
            // https://github.com/xamarin/Xamarin.Forms/issues/4037

            _ = new ChineseLunisolarCalendar();
            _ = new HebrewCalendar();
            _ = new HijriCalendar();
            _ = new JapaneseCalendar();
            _ = new JapaneseLunisolarCalendar();
            _ = new KoreanCalendar();
            _ = new KoreanLunisolarCalendar();
            _ = new PersianCalendar();
            _ = new TaiwanCalendar();
            _ = new TaiwanLunisolarCalendar();
            _ = new ThaiBuddhistCalendar();
            _ = new UmAlQuraCalendar();
        }
Пример #12
0
        public string GetNLMonth(int year, int month, int day)
        {
            string[] monthname = { "正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月" };
            ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();
            DateTime datetime = new DateTime(year, month, day);

            int nlyear  = calendar.GetYear(datetime);
            int nlmonth = calendar.GetMonth(datetime);

            //判断是否有闰月 ,leap=0即没有闰月
            int leapmonth = calendar.GetLeapMonth(nlyear);

            if (leapmonth > 0)
            {
                if (leapmonth <= nlmonth)
                {
                    nlmonth--;
                }
            }
            return(monthname[nlmonth - 1].ToString());
        }
Пример #13
0
 /// <summary>
 /// 返回指定公历日期的阴历时间
 /// </summary>
 /// <param name="time"></param>
 public ChinaDateTime(DateTime time)
 {
     cc = new System.Globalization.ChineseLunisolarCalendar();
     if (time > cc.MaxSupportedDateTime || time < cc.MinSupportedDateTime)
     {
         throw new Exception("参数日期时间不在支持的范围内,支持范围:" + cc.MinSupportedDateTime.ToShortDateString() + "到" + cc.MaxSupportedDateTime.ToShortDateString());
     }
     year  = cc.GetYear(time);
     month = cc.GetMonth(time);
     if (month > 12)
     {
         month -= 12;
     }
     dayOfMonth = cc.GetDayOfMonth(time);
     isLeap     = cc.IsLeapMonth(year, month);
     if (isLeap)
     {
         month -= 1;
     }
     this.time = time;
 }
Пример #14
0
        private static DateTime AsGregorianDate(int year, int month, int day)
        {
            bool IsLeapMonth = IsLeapYear(year);

            ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();

            if (year < 1902 || year > 2100)
            {
                throw new BusinessException("年超过范围");
            }
            if (month < 1 || month > 12)
            {
                throw new BusinessException("月份超过范围");
            }
            if (day < 1 || day > calendar.GetDaysInMonth(year, month))
            {
                throw new BusinessException("天数超过范围");
            }

            int num1 = 0, num2 = 0;
            int leapMonth = calendar.GetLeapMonth(year);

            if (((leapMonth == month + 1) && IsLeapMonth) || (leapMonth > 0 && leapMonth <= month))
            {
                num2 = month;
            }
            else
            {
                num2 = month - 1;
            }

            while (num2 > 0)
            {
                num1 += calendar.GetDaysInMonth(year, num2--);
            }

            DateTime dt = GetLunarNewYearDate(year);

            return(dt.AddDays(num1 + day - 1));
        }
Пример #15
0
        public ToolChineseDateTime(DateTime dateTime)
        {
            _chineseDateTime = new ChineseLunisolarCalendar();
            if (dateTime < _chineseDateTime.MinSupportedDateTime || dateTime > _chineseDateTime.MaxSupportedDateTime)
            {
                throw new ArgumentOutOfRangeException(
                          $"参数日期不在有效的范围内:只支持{_chineseDateTime.MinSupportedDateTime.ToShortTimeString()}到{_chineseDateTime.MaxSupportedDateTime}");
            }

            Year         = _chineseDateTime.GetYear(dateTime);
            Month        = _chineseDateTime.GetMonth(dateTime);
            Day          = _chineseDateTime.GetDayOfMonth(dateTime);
            IsLeep       = _chineseDateTime.IsLeapMonth(Year, Month);
            _dateTime    = dateTime;
            _serialMonth = Month;
            var leepMonth = _chineseDateTime.GetLeapMonth(Year);

            if (leepMonth > 0 && leepMonth <= Month)
            {
                Month--;
            }
        }
Пример #16
0
        /// <summary>
        /// 获取农历日期
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string GetChinaDay(this ChineseLunisolarCalendar china, DateTime dt)
        {
            int    iDay    = china.GetDayOfMonth(dt);
            string szText1 = "初十廿三";
            string szText2 = "一二三四五六七八九十";
            string strDay;

            if (iDay == 20)
            {
                strDay = "二十";
            }
            else if (iDay == 30)
            {
                strDay = "三十";
            }
            else
            {
                strDay = szText1.Substring((iDay - 1) / 10, 1);
                strDay = strDay + szText2.Substring((iDay - 1) % 10, 1);
            }
            return(strDay);
        }
Пример #17
0
        /// <summary>
        ///     根据农历,返回对应公历日期
        /// </summary>
        /// <param name="year">年份</param>
        /// <param name="month">月份</param>
        /// <param name="day">天</param>
        /// <returns></returns>
        public static DateTime ConvertLunisolarToDate(int year, int month, int day)
        {
            var calendar = new ChineseLunisolarCalendar();

            try
            {
                int leapMonth = calendar.GetLeapMonth(year);

                //bool isLeapMonth = month == leapMonth;
                var iMonth = month;
                if (leapMonth != 0 && month >= leapMonth)
                {
                    iMonth++;
                }
                return(calendar.ToDateTime(year, iMonth, day, 0, 0, 0, 0));
            }
            catch (Exception ex)
            {
                //Logger.Error(string.Format("农历日期转换错误[{0}-{1}-{2}]:", year, month, day), ex);
                return(Convert.ToDateTime("1900-1-1"));
            }
        }
Пример #18
0
        //农历转公历
        public static DateTime LunarToSolar(this DateTime time)
        {
            ChineseLunisolarCalendar lunarCalendar;
            DateTime solar;
            int      year, month, day;
            int      leapMonth;

            lunarCalendar = new ChineseLunisolarCalendar();
            solar         = time;
            year          = solar.Year;
            month         = solar.Month;
            day           = Math.Min(solar.Day, lunarCalendar.GetDaysInMonth(year, month));
            leapMonth     = lunarCalendar.GetLeapMonth(year);

            if (0 < leapMonth && leapMonth <= month)
            {
                ++month;
            }

            solar = lunarCalendar.ToDateTime(year, month, day, 0, 0, 0, 0);
            return(solar);
        }
Пример #19
0
        public LunarDate()
        {
            clc = new ChineseLunisolarCalendar();

            #region 生成六十甲子
            int tg = 0;
            int dz = 0;
            for (int count = 0; count < sixtyJiaZi.Length; count++)
            {
                sixtyJiaZi[count] = tianGan[tg] + "" + diZhi[dz];
                tg++;
                dz++;
                if (tg == 10)
                {
                    tg = 0;
                }
                if (dz == 12)
                {
                    dz = 0;
                }
            }
            #endregion
        }
Пример #20
0
        /// <summary>
        /// 转换为农历年
        /// </summary>
        /// <param name="date">日期</param>
        /// <returns>农历年</returns>
        public static string ToChineseDate(this DateTime date)
        {
            ChineseLunisolarCalendar cnDate = new ChineseLunisolarCalendar();

            string[] months    = { string.Empty, "正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月" };
            string[] days      = { string.Empty, "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十" };
            string[] years     = { string.Empty, "甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛己", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸丑", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥" };
            int      year      = cnDate.GetYear(date);
            string   year_cn   = years[cnDate.GetSexagenaryYear(date)];
            int      month     = cnDate.GetMonth(date),
                     day       = cnDate.GetDayOfMonth(date),
                     leapMonth = cnDate.GetLeapMonth(year);
            string month_cn    = months[month];

            if (leapMonth > 0)
            {
                month_cn = month == leapMonth?string.Format("闰{0}", months[month - 1]) : month_cn;

                month_cn = month > leapMonth ? months[month - 1] : month_cn;
            }

            return(string.Format("{0}年{1}{2}", year_cn, month_cn, days[day]));
        }
Пример #21
0
        internal static CalendarLunar GetLunar(ChineseLunisolarCalendar calendar, DateTime date)
        {
            if (calendar == null)
            {
                return(null);
            }
            CalendarLunar lunar = new CalendarLunar();

            lunar.Year  = calendar.GetYear(date);
            lunar.Day   = calendar.GetDayOfMonth(date);
            lunar.Month = calendar.GetMonth(date);

            int leapMonth = calendar.GetLeapMonth(lunar.Year);

            lunar.IsLeapMonth = leapMonth == lunar.Month;

            lunar.YearName =
                $"{"甲乙丙丁戊己庚辛壬癸"[(lunar.Year - 4) % 10]}{"子丑寅卯辰巳午未申酉戌亥"[(lunar.Year - 4) % 12]}({"鼠牛虎兔龙蛇马羊猴鸡狗猪"[(lunar.Year - 4) % 12]})年";

            var leap = lunar.IsLeapMonth ? "闰" : string.Empty;

            lunar.MonthName =
                $"{leap}{"无正二三四五六七八九十冬腊"[leapMonth > 0 && leapMonth <= lunar.Month ? lunar.Month - 1 : lunar.Month]}月";
Пример #22
0
        public Birthday(string RawString)
        {
            string[] strings = RawString.Split('\t');
            if (strings.Length < 4)
            {
                throw new IndexOutOfRangeException(RawString + "\tBirthday:Birthday Object Create Failed");
            }

            Name = strings[0];
            LunarCalendarString = strings[1];
            SolarCalenderString = strings[2];
            Tel = strings[3];
            if (!LunarCalendarString.Equals(String.Empty))
            {
                ChineseLunisolarCalendar clc = new ChineseLunisolarCalendar();
                LunarCalendar     = clc.ToDateTime(DateTime.Now.Year, GetMonthFromString(strings[1]), GetDateFromString(strings[1]), 0, 0, 0, 0);
                NextLunarCalendar = clc.ToDateTime(DateTime.Now.Year + 1, GetMonthFromString(strings[1]), GetDateFromString(strings[1]), 0, 0, 0, 0);
            }
            if (!SolarCalenderString.Equals(String.Empty))
            {
                SolarCalender     = new DateTime(DateTime.Now.Year, GetMonthFromString(strings[2]), GetDateFromString(strings[2]));
                NextSolarCalender = new DateTime(DateTime.Now.Year + 1, GetMonthFromString(strings[2]), GetDateFromString(strings[2]));
            }
        }
Пример #23
0
        /// <summary>
        /// 返回指定农历年,月,日,是否为闰月的农历日期时间
        /// </summary>
        /// <param name="Year"></param>
        /// <param name="Month"></param>
        /// <param name="DayOfMonth"></param>
        /// <param name="IsLeap"></param>
        public ChinaDateTime(int Year, int Month, int DayOfMonth)
        {
            cc = new System.Globalization.ChineseLunisolarCalendar();
            if (Year >= cc.MaxSupportedDateTime.Year || Year <= cc.MinSupportedDateTime.Year)
            {
                throw new Exception("参数年份时间不在支持的范围内,支持范围:" + cc.MinSupportedDateTime.ToShortDateString() + "到" + cc.MaxSupportedDateTime.ToShortDateString());
            }

            if (Month < 1 || Month > 12)
            {
                throw new Exception("月份必须在1~12范围");
            }
            cc = new System.Globalization.ChineseLunisolarCalendar();

            if (cc.GetDaysInMonth(Year, cc.IsLeapMonth(Year, Month) ? Month + 1 : Month) < DayOfMonth || DayOfMonth < 1)
            {
                throw new Exception("指定的月中的天数不在当前月天数有效范围");
            }
            year       = Year;
            month      = Month;
            dayOfMonth = DayOfMonth;
            isLeap     = IsLeap;
            time       = DateTime.Now;
        }
Пример #24
0
        public ToolChineseDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, bool isLeap = false)
        {
            _chineseDateTime = new ChineseLunisolarCalendar();
            if (year < _chineseDateTime.MinSupportedDateTime.Year || year >= _chineseDateTime.MaxSupportedDateTime.Year)
            {
                throw new ArgumentOutOfRangeException(
                          $"参数年份不在有效的范围内,只支持{_chineseDateTime.MinSupportedDateTime.Year}到{_chineseDateTime.MaxSupportedDateTime.Year - 1}");
            }

            if (month < 1 || month > 12)
            {
                throw new ArgumentOutOfRangeException($"月份只支持1-12");
            }
            IsLeep = isLeap;
            var leepMonth = _chineseDateTime.GetLeapMonth(year);

            if (leepMonth - 1 != month)
            {
                IsLeep = false;
            }
            _serialMonth = month;
            if (leepMonth > 0 && (month == leepMonth - 1 && isLeap || month > leepMonth - 1))
            {
                _serialMonth = month + 1;
            }

            if (_chineseDateTime.GetDaysInMonth(year, _serialMonth) < day || day < 1)
            {
                throw new ArgumentOutOfRangeException($"指定的月份天数,不在有效的范围内");
            }

            Year      = year;
            Month     = month;
            Day       = day;
            _dateTime = _chineseDateTime.ToDateTime(Year, _serialMonth, Day, hour, minute, second, millisecond);
        }
Пример #25
0
    public string cDate()
    {
        ChineseLunisolarCalendar l = new ChineseLunisolarCalendar();

        string sYear = "", sYearArab = "", sMonth = "", sDay = "", sDay10 = "",
               sDay1 = "", sLuniSolarDate = "", sBirthpet = "";

        int iYear, iMonth, iDay;

        iYear  = l.GetYear(solarDT);
        iMonth = l.GetMonth(solarDT);
        iDay   = l.GetDayOfMonth(solarDT);

        //Format Year
        sYearArab = iYear.ToString();
        for (int i = 0; i < sYearArab.Length; i++)
        {
            sYear += (aDigi)int.Parse(sYearArab.Substring(i, 1));
        }

        //Format Month
        int iLeapMonth = l.GetLeapMonth(iYear);//獲取閏月

        /* 閏月可以出現在一年的任何月份之後。
         * 例如,GetMonth 方法返回一個介於 1 到 13 之間的數字來表示與指定日期關聯的月份。
         * 如果在一年的八月和九月之間有一個閏月,則 GetMonth 方法為八月返回 8,為閏八月返回 9,為九月返回 10。
         */
        if (iLeapMonth > 0 && iMonth <= iLeapMonth)
        {
            string mMonth = "閏" + (aMonth)(iLeapMonth - 1);
            if (iMonth == iLeapMonth)
            {
                sMonth = mMonth;
            }
            else
            {
                sMonth = ((aMonth)iMonth).ToString();
            }
        }
        else if (iLeapMonth > 0 && iMonth > iLeapMonth)
        {
            sMonth = ((aMonth)(iMonth - 1)).ToString();
        }
        else
        {
            sMonth = ((aMonth)(iMonth)).ToString();
        }


        //Format Day
        sDay10 = ((a10)(iDay / 10)).ToString();
        sDay1  = ((aDigi)(iDay % 10)).ToString();
        sDay   = sDay10 + sDay1;

        if (iDay == 10)
        {
            sDay = "初十";
        }
        if (iDay == 20)
        {
            sDay = "二十";
        }
        if (iDay == 30)
        {
            sDay = "三十";
        }

        //生肖
        int iBirthYear = l.GetSexagenaryYear(solarDT);
        int iBirthpet  = l.GetTerrestrialBranch(iBirthYear);

        sBirthpet = ((birthpet)iBirthpet).ToString();

        //Format Lunar Date
        sLuniSolarDate = string.Format("農曆:{0}年 {1}{2} {3}", sYear, sMonth, sDay, sBirthpet);
        return(sLuniSolarDate);
    }
 /// <summary>
 /// Determine whether the specified day is a leap day.<br />
 /// 判断指定的日是否为闰日。
 /// </summary>
 /// <param name="d"></param>
 /// <param name="calendar"></param>
 /// <returns></returns>
 public static bool IsLeapDay(this DateInfo d, ChineseLunisolarCalendar calendar) => ChineseDateHelper.IsLeapDay(calendar, d);
Пример #27
0
 public static void ChineseLunisolarTest()
 {
     ChineseLunisolarCalendar cal3 = new ChineseLunisolarCalendar();
     int[] eras = cal3.Eras;
     Assert.Equal(1, eras.Length);
 }
Пример #28
0
        public void GetLeapMonth()
        {
            GregorianCalendar gc = new GregorianCalendar();

            Assert.AreEqual(0, gc.GetLeapMonth(2007), "#1-1");
            Assert.AreEqual(0, gc.GetLeapMonth(2008), "#1-2");
            Assert.AreEqual(0, gc.GetLeapMonth(2100), "#1-3");
            Assert.AreEqual(0, gc.GetLeapMonth(2000), "#1-4");

            JulianCalendar jc = new JulianCalendar();

            Assert.AreEqual(0, jc.GetLeapMonth(2007), "#2-1");
            Assert.AreEqual(0, jc.GetLeapMonth(2008), "#2-2");
            Assert.AreEqual(0, jc.GetLeapMonth(2100), "#2-3");
            Assert.AreEqual(0, jc.GetLeapMonth(2000), "#2-4");
            Assert.AreEqual(0, jc.GetLeapMonth(2009), "#2-5");
            Assert.AreEqual(0, jc.GetLeapMonth(2010), "#2-6");

            HebrewCalendar hc = new HebrewCalendar();

            // 3rd, 6th, 8th, 11th 14th and 17th year in every 19 are leap.
            // 5339 % 19 = 0.
            Assert.AreEqual(0, hc.GetLeapMonth(5343), "#3-1");
            Assert.AreEqual(0, hc.GetLeapMonth(5344), "#3-2");
            Assert.AreEqual(7, hc.GetLeapMonth(5345), "#3-3");
            Assert.AreEqual(0, hc.GetLeapMonth(5346), "#3-4");
            Assert.AreEqual(7, hc.GetLeapMonth(5347), "#3-5");
            Assert.AreEqual(0, hc.GetLeapMonth(5348), "#3-6");
            Assert.AreEqual(0, hc.GetLeapMonth(5349), "#3-7");

            ThaiBuddhistCalendar tc = new ThaiBuddhistCalendar();

            Assert.AreEqual(0, tc.GetLeapMonth(2520), "#4-1");
            Assert.AreEqual(0, tc.GetLeapMonth(2521), "#4-2");
            Assert.AreEqual(0, tc.GetLeapMonth(2522), "#4-3");
            Assert.AreEqual(0, tc.GetLeapMonth(2523), "#4-4");

            ChineseLunisolarCalendar cc = new ChineseLunisolarCalendar();

            Assert.AreEqual(0, cc.GetLeapMonth(2000), "#5-1");
            Assert.AreEqual(5, cc.GetLeapMonth(2001), "#5-2");
            Assert.AreEqual(0, cc.GetLeapMonth(2002), "#5-3");
            Assert.AreEqual(0, cc.GetLeapMonth(2003), "#5-4");
            Assert.AreEqual(3, cc.GetLeapMonth(2004), "#5-5");
            Assert.AreEqual(0, cc.GetLeapMonth(2005), "#5-6");
            Assert.AreEqual(8, cc.GetLeapMonth(2006), "#5-7");
            Assert.AreEqual(0, cc.GetLeapMonth(2007), "#5-8");
            Assert.AreEqual(0, cc.GetLeapMonth(2008), "#5-9");
            Assert.AreEqual(6, cc.GetLeapMonth(2009), "#5-10");
            Assert.AreEqual(0, cc.GetLeapMonth(2010), "#5-11");
            Assert.AreEqual(0, cc.GetLeapMonth(2011), "#5-12");
            Assert.AreEqual(5, cc.GetLeapMonth(2012), "#5-13");
            Assert.AreEqual(0, cc.GetLeapMonth(2013), "#5-14");
            Assert.AreEqual(10, cc.GetLeapMonth(2014), "#5-15");
            Assert.AreEqual(0, cc.GetLeapMonth(2015), "#5-16");
            Assert.AreEqual(0, cc.GetLeapMonth(2016), "#5-17");
            Assert.AreEqual(7, cc.GetLeapMonth(2017), "#5-18");
            Assert.AreEqual(0, cc.GetLeapMonth(2018), "#5-19");
            Assert.AreEqual(0, cc.GetLeapMonth(2019), "#5-20");

            KoreanLunisolarCalendar kc = new KoreanLunisolarCalendar();

            Assert.AreEqual(0, kc.GetLeapMonth(2000), "#6-1");
            Assert.AreEqual(5, kc.GetLeapMonth(2001), "#6-2");
            Assert.AreEqual(0, kc.GetLeapMonth(2002), "#6-3");
            Assert.AreEqual(0, kc.GetLeapMonth(2003), "#6-4");
            Assert.AreEqual(3, kc.GetLeapMonth(2004), "#6-5");
            Assert.AreEqual(0, kc.GetLeapMonth(2005), "#6-6");
            Assert.AreEqual(8, kc.GetLeapMonth(2006), "#6-7");
            Assert.AreEqual(0, kc.GetLeapMonth(2007), "#6-8");
            Assert.AreEqual(0, kc.GetLeapMonth(2008), "#6-9");
            Assert.AreEqual(6, kc.GetLeapMonth(2009), "#6-10");
            Assert.AreEqual(0, kc.GetLeapMonth(2010), "#6-11");
            Assert.AreEqual(0, kc.GetLeapMonth(2011), "#6-12");
            Assert.AreEqual(4, kc.GetLeapMonth(2012));       // off from cn by 1, "#6-13");
            Assert.AreEqual(0, kc.GetLeapMonth(2013), "#6-14");
            Assert.AreEqual(10, kc.GetLeapMonth(2014), "#6-15");
            Assert.AreEqual(0, kc.GetLeapMonth(2015), "#6-16");
            Assert.AreEqual(0, kc.GetLeapMonth(2016), "#6-17");
            Assert.AreEqual(6, kc.GetLeapMonth(2017));       // off from cn by 1, "#6-18");
            Assert.AreEqual(0, kc.GetLeapMonth(2018), "#6-19");
            Assert.AreEqual(0, kc.GetLeapMonth(2019), "#6-20");
        }
Пример #29
0
        ///<inheritdoc/>
        public IEnumerable <PublicHoliday> Get(int year)
        {
            var countryCode = CountryCode.SG;

            // Fixed holidays
            var items = new List <PublicHoliday>
            {
                new PublicHoliday(year, 1, 1, "New Year’s Day", "New Year’s Day", countryCode),
                new PublicHoliday(year, 5, 1, "Labour Day", "Labour Day", countryCode),
                new PublicHoliday(year, 8, 9, "National Day", "National Day", countryCode),
                new PublicHoliday(year, 12, 25, "Christmas Day", "Christmas Day", countryCode),
            };

            // Good Friday
            items.Add(this._catholicProvider.GoodFriday("Good Friday", year, countryCode));

            var chineseCalendar = new ChineseLunisolarCalendar();

            if (year > chineseCalendar.MinSupportedDateTime.Year && year < chineseCalendar.MaxSupportedDateTime.Year)
            {
                var chineseNewYear = chineseCalendar.ToDateTime(year, 1, 1, 0, 0, 0, 0);
                items.Add(new PublicHoliday(chineseNewYear, "Chinese New Year", "Chinese New Year", countryCode));
                items.Add(new PublicHoliday(chineseNewYear.AddDays(1), "Chinese New Year", "Chinese New Year", countryCode));
            }


            //switch (year)
            //{
            //    case 2018:
            //        items.Add(new PublicHoliday(year, 5, 19, "Vesak Day", "Vesak Day", countryCode));
            //        items.Add(new PublicHoliday(year, 6, 5, "Hari Raya Puasa", "Hari Raya Puasa", countryCode));
            //        items.Add(new PublicHoliday(year, 8, 11, "Hari Raya Haji", "Hari Raya Haji", countryCode));
            //        items.Add(new PublicHoliday(year, 10, 27, "Deepavali", "Deepavali", countryCode));
            //        break;
            //    case 2019:
            //        items.Add(new PublicHoliday(year, 5, 29, "Vesak Day", "Vesak Day", countryCode));
            //        items.Add(new PublicHoliday(year, 6, 15, "Hari Raya Puasa", "Hari Raya Puasa", countryCode));
            //        items.Add(new PublicHoliday(year, 8, 22, "Hari Raya Haji", "Hari Raya Haji", countryCode));
            //        items.Add(new PublicHoliday(year, 11, 6, "Deepavali", "Deepavali", countryCode));
            //        break;
            //    case 2020:
            //        items.Add(new PublicHoliday(year, 5, 7, "Vesak Day", "Vesak Day", countryCode));
            //        items.Add(new PublicHoliday(year, 5, 24, "Hari Raya Puasa", "Hari Raya Puasa", countryCode));
            //        items.Add(new PublicHoliday(year, 7, 31, "Hari Raya Haji", "Hari Raya Haji", countryCode));
            //        items.Add(new PublicHoliday(year, 11, 14, "Deepavali", "Deepavali", countryCode));
            //        break;
            //    case 2021:
            //        items.Add(new PublicHoliday(year, 5, 26, "Vesak Day", "Vesak Day", countryCode));
            //        items.Add(new PublicHoliday(year, 5, 13, "Hari Raya Puasa", "Hari Raya Puasa", countryCode));
            //        items.Add(new PublicHoliday(year, 7, 20, "Hari Raya Haji", "Hari Raya Haji", countryCode));
            //        items.Add(new PublicHoliday(year, 11, 4, "Deepavali", "Deepavali", countryCode));
            //        break;
            //    case 2022:
            //        items.Add(new PublicHoliday(year, 5, 2, "Hari Raya Puasa", "Hari Raya Puasa", countryCode));
            //        items.Add(new PublicHoliday(year, 5, 15, "Vesak Day", "Vesak Day", countryCode));
            //        items.Add(new PublicHoliday(year, 7, 9, "Hari Raya Haji", "Hari Raya Haji", countryCode));
            //        items.Add(new PublicHoliday(year, 10, 24, "Deepavali", "Deepavali", countryCode));
            //        break;
            //    default:
            //        break;
            //}

            return(items.OrderBy(o => o.Date));
        }
Пример #30
0
        /// <summary>
        /// Create a new instance of <see cref="ChineseDateTime"/><br />
        /// 创建一个新的 <see cref="ChineseDateTime"/> 实例。
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="day"></param>
        /// <param name="hour"></param>
        /// <param name="minute"></param>
        /// <param name="second"></param>
        /// <param name="millisecond"></param>
        /// <returns></returns>
        public static ChineseDateTime OfLunar(int year, int month, int day, int hour, int minute, int second, int millisecond)
        {
            var calendar = new ChineseLunisolarCalendar();

            return(new ChineseDateTime(calendar.ToDateTime(year, month, day, hour, minute, second, millisecond), calendar));
        }
Пример #31
0
        /// <summary>
        /// Create a new instance of <see cref="ChineseDateTime"/><br />
        /// 创建一个新的 <see cref="ChineseDateTime"/> 实例。
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="day"></param>
        /// <returns></returns>
        public static ChineseDateTime OfLunar(int year, int month, int day)
        {
            var calendar = new ChineseLunisolarCalendar();

            return(new ChineseDateTime(calendar.ToDateTime(year, month, day, 0, 0, 0, 0), calendar));
        }