如何根据当前日期时间发现财政年度

本文关键字:发现 时间 何根 当前日期 | 更新日期: 2023-09-27 18:20:19

我需要一个基于当前或今天日期时间的财政年度。

假设我们认为今天的日期是10 April 2011,那么我需要输出为Financial Year 2012,在某些情况下,我需要以短格式显示与FY12相同的输出。两种方式我都想展示。

在我们的要求中,考虑的财政年度是从April当前年度)到March下一年度

基于当前日期时间。。。输出的场景取决于当前日期时间落在所述时间段或持续时间内。

From 01April2011 to 31March2012 - Financial Year 2012 or FY2012
From 01April2012 to 31March2013 -  Financial Year 2013 or FY2013
From 01April2013 to 31March2014 -  Financial Year 2014 or FY2014
.
.
.

等等…

另一个例子:如果我们将今天的日期时间取为2012年4月16日,那么需要输出Financial Year 2013FY13

请帮助如何在C#中使用LINQ或Regex以极短的格式实现相同的功能。Net3.5

如何根据当前日期时间发现财政年度

几个扩展方法

public static class DateTimeExtensions
{
    public static string ToFinancialYear(this DateTime dateTime)
    {
        return "Financial Year " + (dateTime.Month >= 4 ? dateTime.Year + 1 : dateTime.Year);
    }
    public static string ToFinancialYearShort(this DateTime dateTime)
    {
        return "FY" + (dateTime.Month >= 4 ? dateTime.AddYears(1).ToString("yy") : dateTime.ToString("yy"));
    }
}

我之前已经创建了一个FinancialYear类:

public class FinancialYear
{
    int yearNumber;
    private static readonly int firstMonthInYear = 4;
    public static FinancialYear Current
    {
        get { return new FinancialYear(DateTime.Today); }
    }
    public FinancialYear(DateTime forDate) 
    {
         if (forDate.Month < firstMonthInYear) {
             yearNumber = forDate.Year + 1;
         }
         else {
             yearNumber = forDate.Year;
         }
    }
    public override string ToString() {
        return yearNumber.ToString();
    }
}

其他要点:

  • 查看IFormatProvider,了解如何自定义格式(您可以提供ToString的重载,它采用DateTime这样的格式参数
  • 重写Equals,并实现IEquitable以提供相等
  • 实施IComparable以进行比较
  • 您也可以实现自己的===<>>=并且<=类的运算符

如果财政年度是可变的(例如,公司财政年度可能在7月>6月,而不是在4月>3月纳税年度之后)

/// <summary>
/// Extension method to get the start of the financial year
/// </summary>    
public static DateTime GetStartOfFinancialYear(this DateTime date, int startMonthOfFinancialYear)
{
    if (startMonthOfFinancialYear < 1 || startMonthOfFinancialYear > 12)
        throw new ArgumentException("Must be between 1 and 12","startMonthOfFinancialYear");
    DateTime rtn = new DateTime(date.Year,startMonthOfFinancialYear,1);
    if (date.Month < startMonthOfFinancialYear)
    {
        // Current FY starts last year - e.g. given April to March FY then 1st Feb 2013 FY starts 1st April 20*12*
        rtn = rtn.AddYears(-1);
    }
    return rtn;
}
// Example, Financial Year starts in July
DateTime startFY = DateTime.Now.GetStartOfFinancialYear(7);
DateTime endFY = startFY.AddYears(1).AddDays(-1);

为了改进Russ的上述回答,我建议:

  • 将2个扩展方法合并为1个公共加法逻辑
  • 添加短/长和月份的参数(有些需要十月而不是四月)
  • 添加默认值
  • 省略"财政年度",因为有些人可能会使用"财政年度

public static string ToFYString(this DateTime dateTime, bool longFlag = false, int monthLimit = 3)
{
   var format = longFlag ? "yyyy" : "yy";
   return (dateTime.Month > monthLimit ? dateTime.AddYears(1).ToString(format) : dateTime.ToString(format));
}
  1. 如果四月是你的新财政年度,并且你想做空,请使用.ToFYString()
  2. 如果十月是你的新财政年度,并且你想短期使用.ToFYString(monthLimit: 9)
  3. 如果四月是你的新财政年度,并且你想要长期,请使用.ToFYString(true)
  4. 如果十月是你的新财政年度,并且你想要长期,请使用.ToFYString(true, 9)

尝试以下代码以获取财务年度或期间值。

public int GetFinancialYear(DateTime date)
{
    return date.Month > 6 ? date.Year + 1 : date.Year;
}
public int GetFinancialPeriod(DateTime date)
{
    return date.Month > 6 ? date.Month - 6 : date.Month + 6;
}

我不确定为什么你需要LINQ,但这样的东西还不够

DateTime today = DateTime.Today;
if(today.Month <= 3)
       make this string "Financial Year " + today.ToString("yy")); // OR yyyy for 2013
else 
       "Financial Year " + today.AddYears(1).ToString("yy"));
public class FinancialYear
{
    public YearRepresentation ResolveFinancialYear(DateTime currentDate)
    {
        YearRepresentation financialYear = new YearRepresentation();
        int year = (currentDate.Month >= 4) ? currentDate.AddYears(1).Year : currentDate.Year;
        financialYear.SetYear(year);
        return financialYear;
    }
}
public class YearRepresentation
{
    public string LongYear { get; set; }
    public string ShortYear { get; set; }
    public void SetYear(int year)
    {
        this.LongYear = "Financial Year " + year;
        this.ShortYear = "FY " + year;
    }
}

这是查找当前财政年度的示例。

        string FinYear=null;
        if (DateTime.Today.Month > 3)
        {
            FinYear = "1/4/" + DateTime.Today.Year;
        }
        else
        {
            FinYear = "1/4/" + (DateTime.Today.Year - 1);
        }

这里使用了Valued Tuple(财政年度从7月开始,所以我使用了7。如果你想要

年复一年的

格式只需要使用开始日期和结束日期的月份和年份属性。

public  static (DateTime, DateTime) GetCurrentFinacialYearDateRange()
    {
        if(DateTime.Now.Month >= 7)
        {
            DateTime startDate = new DateTime(DateTime.Today.Year, 7, 1); // 1st July this year
            DateTime endDate = new DateTime(DateTime.Today.Year + 1, 7, 1).AddDays(-1); // Last day in June next year
            return (startDate, endDate);
        }
        else
        {
            DateTime startDate = new DateTime(DateTime.Today.Year-1, 7, 1); // 1st July this year
            DateTime endDate = new DateTime(DateTime.Today.Year, 7, 1).AddDays(-1); // Last day in June next year
            return (startDate, endDate);
        }
        
    }