using System;
using System.Collections.Generic;
// ReSharper disable InconsistentNaming
// ReSharper disable IdentifierTypo
namespace Lunar.Util
{
///
/// 阳历工具
///
public static class SolarUtil
{
///
/// 星期
///
public static readonly string[] WEEK = { "日", "一", "二", "三", "四", "五", "六" };
///
/// 每月天数
///
public static readonly int[] DAYS_OF_MONTH = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
///
/// 星座
///
public static readonly string[] XING_ZUO = { "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯", "水瓶", "双鱼" };
///
/// 节日
///
public static readonly Dictionary FESTIVAL = new Dictionary
{
{ "1-1", "元旦节" },
{ "2-14", "情人节" },
{ "3-8", "妇女节" },
{ "3-12", "植树节" },
{ "3-15", "消费者权益日" },
{ "4-1", "愚人节" },
{ "5-1", "劳动节" },
{ "5-4", "青年节" },
{ "6-1", "儿童节" },
{ "7-1", "建党节" },
{ "8-1", "建军节" },
{ "9-10", "教师节" },
{ "10-1", "国庆节" },
{ "10-31", "万圣节前夜" },
{ "11-1", "万圣节" },
{ "12-24", "平安夜" },
{ "12-25", "圣诞节" }
};
///
/// 按星期的节日
///
public static readonly Dictionary WEEK_FESTIVAL = new Dictionary
{
{ "3-0-1", "全国中小学生安全教育日" },
{ "5-2-0", "母亲节" },
{ "5-3-0", "全国助残日" },
{ "6-3-0", "父亲节" },
{ "9-3-6", "全民国防教育日" },
{ "10-1-1", "世界住房日" },
{ "11-4-4", "感恩节" }
};
///
/// 非正式节日
///
public static readonly Dictionary> OTHER_FESTIVAL = new Dictionary>
{
{"1-8", new List(new[] {"周恩来逝世纪念日"})},
{"1-10", new List(new[] {"中国人民警察节"})},
{"1-14", new List(new[] {"日记情人节"})},
{"1-21", new List(new[] {"列宁逝世纪念日"})},
{"1-26", new List(new[] {"国际海关日"})},
{"1-27", new List(new[] {"国际大屠杀纪念日"})},
{"2-2", new List(new[] {"世界湿地日"})},
{"2-4", new List(new[] {"世界抗癌日"})},
{"2-7", new List(new[] {"京汉铁路罢工纪念日"})},
{"2-10", new List(new[] {"国际气象节"})},
{"2-19", new List(new[] {"邓小平逝世纪念日"})},
{"2-20", new List(new[] {"世界社会公正日"})},
{"2-21", new List(new[] {"国际母语日"})},
{"2-24", new List(new[] {"第三世界青年日"})},
{"3-1", new List(new[] {"国际海豹日"})},
{"3-3", new List(new[] {"世界野生动植物日", "全国爱耳日"})},
{"3-5", new List(new[] {"周恩来诞辰纪念日", "中国青年志愿者服务日"})},
{"3-6", new List(new[] {"世界青光眼日"})},
{"3-7", new List(new[] {"女生节"})},
{"3-12", new List(new[] {"孙中山逝世纪念日"})},
{"3-14", new List(new[] {"马克思逝世纪念日", "白色情人节"})},
{"3-17", new List(new[] {"国际航海日"})},
{"3-18", new List(new[] {"全国科技人才活动日", "全国爱肝日"})},
{"3-20", new List(new[] {"国际幸福日"})},
{"3-21", new List(new[] {"世界森林日", "世界睡眠日", "国际消除种族歧视日"})},
{"3-22", new List(new[] {"世界水日"})},
{"3-23", new List(new[] {"世界气象日"})},
{"3-24", new List(new[] {"世界防治结核病日"})},
{"3-29", new List(new[] {"中国黄花岗七十二烈士殉难纪念日"})},
{"4-2", new List(new[] {"国际儿童图书日", "世界自闭症日"})},
{"4-4", new List(new[] {"国际地雷行动日"})},
{"4-7", new List(new[] {"世界卫生日"})},
{"4-8", new List(new[] {"国际珍稀动物保护日"})},
{"4-12", new List(new[] {"世界航天日"})},
{"4-14", new List(new[] {"黑色情人节"})},
{"4-15", new List(new[] {"全民国家安全教育日"})},
{"4-22", new List(new[] {"世界地球日", "列宁诞辰纪念日"})},
{"4-23", new List(new[] {"世界读书日"})},
{"4-24", new List(new[] {"中国航天日"})},
{"4-25", new List(new[] {"儿童预防接种宣传日"})},
{"4-26", new List(new[] {"世界知识产权日", "全国疟疾日"})},
{"4-28", new List(new[] {"世界安全生产与健康日"})},
{"4-30", new List(new[] {"全国交通安全反思日"})},
{"5-2", new List(new[] {"世界金枪鱼日"})},
{"5-3", new List(new[] {"世界新闻自由日"})},
{"5-5", new List(new[] {"马克思诞辰纪念日"})},
{"5-8", new List(new[] {"世界红十字日"})},
{"5-11", new List(new[] {"世界肥胖日"})},
{"5-12", new List(new[] {"全国防灾减灾日", "护士节"})},
{"5-14", new List(new[] {"玫瑰情人节"})},
{"5-15", new List(new[] {"国际家庭日"})},
{"5-19", new List(new[] {"中国旅游日"})},
{"5-20", new List(new[] {"网络情人节"})},
{"5-22", new List(new[] {"国际生物多样性日"})},
{"5-25", new List(new[] {"525心理健康节"})},
{"5-27", new List(new[] {"上海解放日"})},
{"5-29", new List(new[] {"国际维和人员日"})},
{"5-30", new List(new[] {"中国五卅运动纪念日"})},
{"5-31", new List(new[] {"世界无烟日"})},
{"6-3", new List(new[] {"世界自行车日"})},
{"6-5", new List(new[] {"世界环境日"})},
{"6-6", new List(new[] {"全国爱眼日"})},
{"6-8", new List(new[] {"世界海洋日"})},
{"6-11", new List(new[] {"中国人口日"})},
{"6-14", new List(new[] {"世界献血日", "亲亲情人节"})},
{"6-17", new List(new[] {"世界防治荒漠化与干旱日"})},
{"6-20", new List(new[] {"世界难民日"})},
{"6-21", new List(new[] {"国际瑜伽日"})},
{"6-25", new List(new[] {"全国土地日"})},
{"6-26", new List(new[] {"国际禁毒日", "联合国宪章日"})},
{"7-1", new List(new[] {"香港回归纪念日"})},
{"7-6", new List(new[] {"国际接吻日", "朱德逝世纪念日"})},
{"7-7", new List(new[] {"七七事变纪念日"})},
{"7-11", new List(new[] {"世界人口日", "中国航海日"})},
{"7-14", new List(new[] {"银色情人节"})},
{"7-18", new List(new[] {"曼德拉国际日"})},
{"7-30", new List(new[] {"国际友谊日"})},
{"8-3", new List(new[] {"男人节"})},
{"8-5", new List(new[] {"恩格斯逝世纪念日"})},
{"8-6", new List(new[] {"国际电影节"})},
{"8-8", new List(new[] {"全民健身日"})},
{"8-9", new List(new[] {"国际土著人日"})},
{"8-12", new List(new[] {"国际青年节"})},
{"8-14", new List(new[] {"绿色情人节"})},
{"8-19", new List(new[] {"世界人道主义日", "中国医师节"})},
{"8-22", new List(new[] {"邓小平诞辰纪念日"})},
{"8-29", new List(new[] {"全国测绘法宣传日"})},
{"9-3", new List(new[] {"中国抗日战争胜利纪念日"})},
{"9-5", new List(new[] {"中华慈善日"})},
{"9-8", new List(new[] {"世界扫盲日"})},
{"9-9", new List(new[] {"毛泽东逝世纪念日", "全国拒绝酒驾日"})},
{"9-14", new List(new[] {"世界清洁地球日", "相片情人节"})},
{"9-15", new List(new[] {"国际民主日"})},
{"9-16", new List(new[] {"国际臭氧层保护日"})},
{"9-17", new List(new[] {"世界骑行日"})},
{"9-18", new List(new[] {"九一八事变纪念日"})},
{"9-20", new List(new[] {"全国爱牙日"})},
{"9-21", new List(new[] {"国际和平日"})},
{"9-27", new List(new[] {"世界旅游日"})},
{"9-30", new List(new[] {"中国烈士纪念日"})},
{"10-1", new List(new[] {"国际老年人日"})},
{"10-2", new List(new[] {"国际非暴力日"})},
{"10-4", new List(new[] {"世界动物日"})},
{"10-11", new List(new[] {"国际女童日"})},
{"10-10", new List(new[] {"辛亥革命纪念日"})},
{"10-13", new List(new[] {"国际减轻自然灾害日", "中国少年先锋队诞辰日"})},
{"10-14", new List(new[] {"葡萄酒情人节"})},
{"10-16", new List(new[] {"世界粮食日"})},
{"10-17", new List(new[] {"全国扶贫日"})},
{"10-20", new List(new[] {"世界统计日"})},
{"10-24", new List(new[] {"世界发展信息日", "程序员节"})},
{"10-25", new List(new[] {"抗美援朝纪念日"})},
{"11-5", new List(new[] {"世界海啸日"})},
{"11-8", new List(new[] {"记者节"})},
{"11-9", new List(new[] {"全国消防日"})},
{"11-11", new List(new[] {"光棍节"})},
{"11-12", new List(new[] {"孙中山诞辰纪念日"})},
{"11-14", new List(new[] {"电影情人节"})},
{"11-16", new List(new[] {"国际宽容日"})},
{"11-17", new List(new[] {"国际大学生节"})},
{"11-19", new List(new[] {"世界厕所日"})},
{"11-28", new List(new[] {"恩格斯诞辰纪念日"})},
{"11-29", new List(new[] {"国际声援巴勒斯坦人民日"})},
{"12-1", new List(new[] {"世界艾滋病日"})},
{"12-2", new List(new[] {"全国交通安全日"})},
{"12-3", new List(new[] {"世界残疾人日"})},
{"12-4", new List(new[] {"全国法制宣传日"})},
{"12-5", new List(new[] {"世界弱能人士日", "国际志愿人员日"})},
{"12-7", new List(new[] {"国际民航日"})},
{"12-9", new List(new[] {"世界足球日", "国际反腐败日"})},
{"12-10", new List(new[] {"世界人权日"})},
{"12-11", new List(new[] {"国际山岳日"})},
{"12-12", new List(new[] {"西安事变纪念日"})},
{"12-13", new List(new[] {"国家公祭日"})},
{"12-14", new List(new[] {"拥抱情人节"})},
{"12-18", new List(new[] {"国际移徙者日"})},
{"12-26", new List(new[] {"毛泽东诞辰纪念日"})}
};
///
/// 是否闰年
///
/// 年
/// true/false 闰年/非闰年
public static bool IsLeapYear(int year)
{
if (year < 1600)
{
return year % 4 == 0;
}
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
///
/// 获取某年有多少天(平年365天,闰年366天)
///
/// 年
/// 天数
public static int GetDaysOfYear(int year)
{
if (1582 == year) {
return 355;
}
return IsLeapYear(year) ? 366 : 365;
}
///
/// 获取某年某月有多少天
///
/// 年
/// 月
/// 天数
public static int GetDaysOfMonth(int year, int month)
{
if (1582 == year && 10 == month)
{
return 21;
}
int m = month - 1;
int d = DAYS_OF_MONTH[m];
//公历闰年2月多一天
if (m == 1 && IsLeapYear(year)) {
d++;
}
return d;
}
///
/// 获取某天为当年的第几天
///
/// 年
/// 月
/// 日
/// 第几天
public static int GetDaysInYear(int year, int month, int day)
{
var days = 0;
for (var i = 1; i < month; i++)
{
days += GetDaysOfMonth(year, i);
}
var d = day;
if (1582 == year && 10 == month) {
if (day >= 15) {
d -= 10;
} else if (day > 4)
{
throw new ArgumentException($"wrong solar year {year} month {month} day {day}");
}
}
days += d;
return days;
}
///
/// 获取某年某月有多少周
///
/// 年
/// 月
/// 星期几作为一周的开始,1234560分别代表星期一至星期天
/// 周数
public static int GetWeeksOfMonth(int year, int month, int start)
{
return (int) Math.Ceiling((GetDaysOfMonth(year, month) + Solar.FromYmdHms(year, month, 1).Week - start) * 1D / WEEK.Length);
}
///
/// 获取两个日期之间相差的天数(如果日期a比日期b小,天数为正,如果日期a比日期b大,天数为负)
///
/// 年a
/// 月a
/// 日a
/// 年b
/// 月b
/// 日b
/// 天数
public static int GetDaysBetween(int ay, int am, int ad, int by, int bm, int bd)
{
int n;
int days;
int i;
if (ay == by)
{
n = GetDaysInYear(by, bm, bd) - GetDaysInYear(ay, am, ad);
}
else if (ay > by)
{
days = GetDaysOfYear(by) - GetDaysInYear(by, bm, bd);
for (i = by + 1; i < ay; i++)
{
days += GetDaysOfYear(i);
}
days += GetDaysInYear(ay, am, ad);
n = -days;
}
else
{
days = GetDaysOfYear(ay) - GetDaysInYear(ay, am, ad);
for (i = ay + 1; i < by; i++)
{
days += GetDaysOfYear(i);
}
days += GetDaysInYear(by, bm, bd);
n = days;
}
return n;
}
}
}