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

时间:2012-01-16 10:06:29

标签: c# asp.net regex linq .net-3.5

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

假设我们认为今天的日期是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#,. Net3.5中的LINQ或Regex帮助如何以非常短的格式实现相同的目标

9 个答案:

答案 0 :(得分:14)

一些扩展方法

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"));
    }
}

答案 1 :(得分:4)

我之前创建了一个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的格式参数。
  • override Equals,并实现IEquitable以提供相等。
  • 实施IComparable以提供同情。
  • 你也可以实现自己的==&lt; &GT; &gt; =和&lt; =该类的运算符。

答案 2 :(得分:1)

财务年度可变(例如公司财政年度可能在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);

答案 3 :(得分:1)

改善Russ&#39;回答上面,我建议:

  • 将2种扩展方法合并为1 - 常用加法逻辑
  • 为短/长和月份添加参数(有些需要10月而不是4月)
  • 添加默认值
  • 省略&#34;财政年度&#34;因为有些人可能会使用&#34;会计年度&#34;

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. 如果4月是您的新风险,并且您想要卖空,请使用.ToFYString()
  2. 如果十月是你的新参考,你想要短暂使用.ToFYString(monthLimit: 9)
  3. 如果4月是您的新参考,并且您想要很长时间,请使用.ToFYString(true)
  4. 如果十月是您的新参考,并且您想要多长时间,请使用.ToFYString(true, 9)

答案 4 :(得分:1)

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

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;
}

答案 5 :(得分:0)

我不确定你为什么需要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"));

答案 6 :(得分:0)

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;
    }
}

答案 7 :(得分:0)

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

        string FinYear=null;

        if (DateTime.Today.Month > 3)
        {

            FinYear = "1/4/" + DateTime.Today.Year;
        }

        else
        {
            FinYear = "1/4/" + (DateTime.Today.Year - 1);
        }

答案 8 :(得分:-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);
        }
        
    }