Get Taiwan Invoice Period by input datetime
前言
原本這題目想丟給ChatGPT來撰寫,但結果不是太難懂就是不符合我的需求,只好自己想&動手實作了
實作
以下為.Net Console程式
/// <summary>
/// 發票期別
/// </summary>
public class InvoicePeriod
{
public int Year { get; set; } = 0;//西元年
public int Month1 { get; set; } = 0;//月1
public int Month2 { get; set; } = 0;//月2
}
class Program
{
static void Main(string[] args)
{
DateTime dtNow = DateTime.Now;//輸入時間
InvoicePeriod objNow = GetDrawnInvoicePeriod(dtNow);
Console.WriteLine("\"現在時間\"所對應已開獎的統一發票期別:" + $"民國 {(objNow.Year-1911)} 年 {objNow.Month1.ToString("00")}~{objNow.Month2.ToString("00")} 月份");
InvoicePeriod objPre = GetDrawnInvoicePeriod(dtNow.AddMonths(-2));
Console.WriteLine("\"上一期\"已開獎的統一發票期別:" + $"西元 {objPre.Year} 年 {objPre.Month1.ToString("00")}~{objPre.Month2.ToString("00")} 月份");
}
/// <summary>
/// 輸入時間取得距離該時間最近一期的統一發票開獎期別
/// </summary>
/// <param name="dtInput">輸入時間</param>
/// <returns></returns>
static InvoicePeriod GetDrawnInvoicePeriod(DateTime dtInput)
{
int input_year = dtInput.Year;//輸入的西元年
//回傳物件(dtInput對應的最近一期的開獎發票期別)
InvoicePeriod result = new InvoicePeriod();
//dtStart、dtEnd為統一發票開獎日期區間
DateTime dtStart = new DateTime((input_year-1), 11, 25);
DateTime dtEnd = new DateTime(input_year, 1, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = (input_year - 1);
result.Month1 = 9;
result.Month2 = 10;
return result;
}
dtStart = new DateTime(input_year,1,25);
dtEnd = new DateTime(input_year,3,25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = (input_year - 1);
result.Month1 = 11;
result.Month2 = 12;
return result;
}
dtStart = new DateTime(input_year, 3, 25);
dtEnd = new DateTime(input_year, 5, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = input_year;
result.Month1 = 1;
result.Month2 = 2;
return result;
}
dtStart = new DateTime(input_year, 5, 25);
dtEnd = new DateTime(input_year, 7, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = input_year;
result.Month1 = 3;
result.Month2 = 4;
return result;
}
dtStart = new DateTime(input_year, 7, 25);
dtEnd = new DateTime(input_year, 9, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = input_year;
result.Month1 = 5;
result.Month2 = 6;
return result;
}
dtStart = new DateTime(input_year, 9, 25);
dtEnd = new DateTime(input_year, 11, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = input_year;
result.Month1 = 7;
result.Month2 = 8;
return result;
}
dtStart = new DateTime(input_year, 11, 25);
dtEnd = new DateTime( (input_year+1), 1, 25);
if (dtStart <= dtInput && dtInput < dtEnd)
{//設定發票期別資訊
result.Year = input_year;
result.Month1 = 9;
result.Month2 = 10;
return result;
}
return result;
}
}
執行結果