using Lunar.Util;
// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable UnusedAutoPropertyAccessor.Global
namespace Lunar.EightChar
{
///
/// 运
///
public class Yun
{
///
/// 性别(1男,0女)
///
public int Gender { get; }
///
/// 起运年数
///
public int StartYear { get; }
///
/// 起运月数
///
public int StartMonth { get; }
///
/// 起运天数
///
public int StartDay { get; }
///
/// 起运小时
///
public int StartHour { get; }
///
/// 是否顺推
///
public bool Forward { get; }
///
/// 阴历
///
public Lunar Lunar { get; }
///
/// 创建运
///
/// 八字
/// 性别
/// 流派
public Yun(EightChar eightChar, int gender, int sect = 1)
{
Lunar = eightChar.Lunar;
Gender = gender;
var yang = 0 == Lunar.YearGanIndexExact % 2;
var man = 1 == gender;
Forward = (yang && man) || (!yang && !man);
// 起运计算
var prev = Lunar.GetPrevJie();
var next = Lunar.GetNextJie();
var current = Lunar.Solar;
var start = Forward ? current : prev.Solar;
var end = Forward ? next.Solar : current;
int year;
int month;
int day;
var hour = 0;
if (2 == sect)
{
var minutes = end.SubtractMinute(start);
var y = minutes / 4320;
minutes -= y * 4320;
var m = minutes / 360;
minutes -= m * 360;
var d = minutes / 12;
minutes -= d * 12;
var h = minutes * 2;
year = y;
month = m;
day = d;
hour = h;
}
else
{
var endTimeZhiIndex = (end.Hour == 23) ? 11 : LunarUtil.GetTimeZhiIndex(end.YmdHms.Substring(11, 5));
var startTimeZhiIndex = (start.Hour == 23) ? 11 : LunarUtil.GetTimeZhiIndex(start.YmdHms.Substring(11, 5));
// 时辰差
var hourDiff = endTimeZhiIndex - startTimeZhiIndex;
var dayDiff = end.Subtract(start);
if (hourDiff < 0)
{
hourDiff += 12;
dayDiff--;
}
var monthDiff = hourDiff * 10 / 30;
month = dayDiff * 4 + monthDiff;
day = hourDiff * 10 - monthDiff * 30;
year = month / 12;
month = month - year * 12;
}
StartYear = year;
StartMonth = month;
StartDay = day;
StartHour = hour;
}
///
/// 获取起运的阳历日期
///
/// 阳历日期
public Solar StartSolar
{
get
{
var solar = Lunar.Solar;
solar = solar.NextYear(StartYear);
solar = solar.NextMonth(StartMonth);
solar = solar.Next(StartDay);
return solar.NextHour(StartHour);
}
}
///
/// 获取大运
///
/// 轮数
/// 大运
public DaYun[] GetDaYun(int n = 10)
{
var l = new DaYun[n];
for (var i = 0; i < n; i++)
{
l[i] = new DaYun(this, i);
}
return l;
}
}
}