[C#] 依據輸入時間取得距離該時間最近一期的統一發票開獎期別

  • 75
  • 0
  • C#
  • 2024-04-14

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;
    }
}
執行結果