📄 date.cs
字号:
0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2039
0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2040
0xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2041
0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2042
0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2043
0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96, //2044
0xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2045
0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, //2046
0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2047
0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96, //2048
0xA4, 0xC3, 0xA5, 0xA5, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86, //2049
0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x78, 0x78, 0x87, 0x87 //2050
};
#endregion
#region Core
/// <summary>
/// 取得指定阴历年的阴历闰月月份。
/// </summary>
/// <param name="iLunarYear">年份。</param>
/// <returns>返回指定年的闰月月份。</returns>
private int GetLeapMonth(ushort iLunarYear)
{
byte Flag;
if (iLunarYear < START_YEAR || iLunarYear > END_YEAR)
{
return 0;
}
Flag = gLunarMonth[(iLunarYear - START_YEAR) / 2];
if ((iLunarYear - START_YEAR) % 2 == 0)
{
return Flag >> 4;
}
else
{
return Flag & 0x0F;
}
}
/// <summary>
/// 计算指定阴历年月的总天数。
/// </summary>
/// <param name="iLunarYear">年份。</param>
/// <param name="iLunarMonth">月份。</param>
/// <returns>
/// 返回阴历阴历年月的天数,如果该月为闰月,高字为第二个该月的天数,否则高字为0。
/// </returns>
/// <remarks>
/// 指定年月范围在1901年1月---2050年12月之间。
/// </remarks>
private uint GetLunarMonthDays(ushort iLunarYear, ushort iLunarMonth)
{
int Height, Low;
int iBit;
if (iLunarYear < START_YEAR || iLunarYear > END_YEAR)
{
return 30;
}
Height = 0;
Low = 29;
iBit = 16 - iLunarMonth;
if (iLunarMonth > GetLeapMonth(iLunarYear) && GetLeapMonth(iLunarYear) > 0)
{
iBit--;
}
if ((gLunarMonthDay[iLunarYear - START_YEAR] & (1 << iBit)) > 0)
{
Low++;
}
if (iLunarMonth == GetLeapMonth(iLunarYear))
{
if ((gLunarMonthDay[iLunarYear - START_YEAR] & (1 << (iBit - 1))) > 0)
{
Height = 30;
}
else
{
Height = 29;
}
}
return (uint)(Low) | (uint)(Height) << 16; //合成为uint
}
/// <summary>
/// 计算指定阴历年总天数。
/// </summary>
/// <param name="iLunarYear">指定阴历年,范围1901-2050。</param>
/// <returns>返指定阴历年的总天数。</returns>
private int GetLunarYearDays(ushort iLunarYear)
{
int Days;
uint tmp;
if (iLunarYear < START_YEAR || iLunarYear > END_YEAR)
{
return 0;
}
Days = 0;
for (ushort i = 1; i <= 12; i++)
{
tmp = GetLunarMonthDays(iLunarYear, i);
Days = Days + ((ushort)(tmp >> 16) & 0xFFFF); //取高位
Days = Days + (ushort)(tmp); //取低位
}
return Days;
}
/// <summary>
/// 计算从1901年1月1日过iSpanDays天后的阴历日期
/// </summary>
/// <param name="iYear">返回的年份。</param>
/// <param name="iMonth">返回的月份。</param>
/// <param name="iDay">返回的日子。</param>
/// <param name="iSpanDays">天数。</param>
private void CalcLunarDate(out ushort iYear, out ushort iMonth, out ushort iDay, uint iSpanDays)
{
uint tmp;
//阳历1901年2月19日为阴历1901年正月初一
//阳历1901年1月1日到2月19日共有49天
if (iSpanDays < 49)
{
iYear = START_YEAR - 1;
if (iSpanDays < 19)
{
iMonth = 11;
iDay = (ushort)(11 + iSpanDays);
}
else
{
iMonth = 12;
iDay = (ushort)(iSpanDays - 18);
}
return;
}
//下面从阴历1901年正月初一算起
iSpanDays = iSpanDays - 49;
iYear = START_YEAR;
iMonth = 1;
iDay = 1;
//计算年
tmp = (uint)GetLunarYearDays(iYear);
while (iSpanDays >= tmp)
{
iSpanDays = iSpanDays - tmp;
iYear++;
tmp = (uint)GetLunarYearDays(iYear);
}
//计算月
tmp = GetLunarMonthDays(iYear, iMonth); //取低位
while (iSpanDays >= tmp)
{
iSpanDays = iSpanDays - tmp;
if (iMonth == GetLeapMonth(iYear))
{
tmp = (GetLunarMonthDays(iYear, iMonth) >> 16) & 0xFFFF; //取高位
if (iSpanDays < tmp)
{
break;
}
iSpanDays = iSpanDays - tmp;
}
iMonth++;
tmp = GetLunarMonthDays(iYear, iMonth); //取低位
}
//计算日
iDay = (ushort)(iDay + iSpanDays);
}
#endregion
#region 星座
/// <summary>
/// 计算指定当前日期的星座序号。
/// </summary>
/// <returns>星座序号。</returns>
private int GetConstellationIndex()
{
int Y, M, D;
Y = m_Date.Year;
M = m_Date.Month;
D = m_Date.Day;
Y = M * 100 + D;
if (Y >= 321 && Y <= 419)
{
return 0;
}
else if (Y >= 420 && Y <= 520)
{
return 1;
}
else if (Y >= 521 && Y <= 620)
{
return 2;
}
else if (Y >= 621 && Y <= 722)
{
return 3;
}
else if (Y >= 723 && Y <= 822)
{
return 4;
}
else if (Y >= 823 && Y <= 922)
{
return 5;
}
else if (Y >= 923 && Y <= 1022)
{
return 6;
}
else if (Y >= 1023 && Y <= 1121)
{
return 7;
}
else if (Y >= 1122 && Y <= 1221)
{
return 8;
}
else if (Y >= 1222 || Y <= 119)
{
return 9;
}
else if (Y >= 120 && Y <= 218)
{
return 10;
}
else if (Y >= 219 && Y <= 320)
{
return 11;
}
else
{
return -1;
}
}
/// <summary>
/// 格式化星座序号为星座名称。
/// </summary>
/// <param name="ConstellationIndex">星座序号。</param>
/// <returns>星座名称。</returns>
private string FormatConstellation(int ConstellationIndex)
{
if (ConstellationIndex >= 0 && ConstellationIndex <= 11)
{
return ConstellationName[ConstellationIndex];
}
else
{
return "";
}
}
#endregion
#region 节气
/// <summary>
/// 计算公历当天对应的节气序号。
/// </summary>
/// <returns>返回值0-23为节气序号,-1表示不是节气。</returns>
private int GetSolarTermIndex()
{
byte Flag;
int Day, iYear, iMonth, iDay;
iYear = m_Date.Year;
if (iYear < START_YEAR || iYear > END_YEAR)
{
return -1;
}
iMonth = m_Date.Month;
iDay = m_Date.Day;
Flag = gLunarHolDay[(iYear - START_YEAR) * 12 + iMonth - 1];
if (iDay < 15)
{
Day = 15 - ((Flag >> 4) & 0x0f);
}
else
{
Day = (Flag & 0x0f) + 15;
}
if (iDay == Day)
{
if (iDay > 15)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -