using System;
using System.Collections.Generic;
using Lunar.Util;
// ReSharper disable MemberCanBePrivate.Global
namespace Lunar
{
///
/// 阳历月
///
public class SolarMonth
{
///
/// 年
///
public int Year { get; }
///
/// 月
///
public int Month { get; }
///
/// 默认日期
///
public SolarMonth(): this(DateTime.Now)
{
}
///
/// 通过日期初始化
///
/// 日期
public SolarMonth(DateTime date): this(date.Year, date.Month)
{
}
///
/// 通过年月初始化
///
/// 年
/// 月
public SolarMonth(int year, int month)
{
Year = year;
Month = month;
}
///
/// 通过指定日期获取阳历月
///
/// 日期
/// 阳历月
public static SolarMonth FromDate(DateTime date)
{
return new SolarMonth(date);
}
///
/// 通过指定年月获取阳历月
///
/// 年
/// 月
/// 阳历月
public static SolarMonth FromYm(int year, int month)
{
return new SolarMonth(year, month);
}
///
/// 本月的阳历日期列表
///
public List Days
{
get
{
var l = new List(31);
var d = new Solar(Year, Month, 1);
l.Add(d);
var days = SolarUtil.GetDaysOfMonth(Year, Month);
for (var i = 1; i < days; i++)
{
l.Add(d.Next(i));
}
return l;
}
}
///
/// 获取本月的阳历周列表
///
/// 星期几作为一周的开始,1234560分别代表星期一至星期天
/// 周列表
public List GetWeeks(int start) {
var l = new List();
var week = SolarWeek.FromYmd(Year, Month, 1, start);
while (true) {
l.Add(week);
week = week.Next(1, false);
var firstDay = week.FirstDay;
if (firstDay.Year > Year || firstDay.Month > Month) {
break;
}
}
return l;
}
///
/// 获取往后推几个月的阳历月,如果要往前推,则月数用负数
///
/// 月数
/// 阳历月
public SolarMonth Next(int months)
{
var n = months < 0 ? -1 : 1;
var m = Math.Abs(months);
var y = Year + m / 12 * n;
m = Month + m % 12 * n;
if (m > 12) {
m -= 12;
y++;
} else if (m < 1) {
m += 12;
y--;
}
return new SolarMonth(y, m);
}
///
public override string ToString()
{
return Year + "-" + Month;
}
///
/// 完整字符串输出
///
public string FullString => Year + "年" + Month + "月";
}
}