【问题标题】:How to discover financial Year based on current datetime?如何根据当前日期时间发现财政年度?
【发布时间】:2012-02-11 07:10:43
【问题描述】:

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

假设我们认为今天的日期是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
.
.
.

等等....

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

请帮助如何在 C#、.Net3.5 中使用 LINQ 或 Regex 以非常短的格式实现相同的目的

【问题讨论】:

  • 这与 LINQ 和 Regex 有什么关系,如果其他方法对您有用,会不会很简单?

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


【解决方案1】:

几个扩展方法

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

【讨论】:

    【解决方案2】:

    我之前通过创建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 以提供比较。
    • 您还可以为该类实现自己的 == >= 和

    【讨论】:

      【解决方案3】:

      财政年度是可变的(例如,公司财政年度可能运行 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);
      

      【讨论】:

      • 这段代码中的 endFY 几乎会出错一整天。财政年度的结束将是 startFY.AddYears(1).AddTicks(-1) 得到 23:59:59.9999999 ...您的代码将给出财政年度最后一天的开始而不是结束它
      【解决方案4】:

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

      • 将 2 种扩展方法合并为 1 种 - 通用加法逻辑
      • 为 Short/Long 和月份添加参数(有些需要 Oct 而不是 April)
      • 添加默认值
      • 省略“财政年度”,因为有些人可能使用“财政年度”
      
      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. 如果 10 月是您的新财年并且您想短期使用 .ToFYString(monthLimit: 9)
      3. 如果 4 月是您的新财年,并且您想要多长时间,请使用 .ToFYString(true)
      4. 如果 10 月是您的新财年,并且您想要多长时间,请使用 .ToFYString(true, 9)

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案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"));
          

          【讨论】:

            【解决方案7】:
            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;
                }
            }
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                这里使用了 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);
                        }
                        
                    }
                

                【讨论】:

                • 这如何回答这个问题?
                猜你喜欢
                • 1970-01-01
                • 2020-10-06
                • 1970-01-01
                • 1970-01-01
                • 2019-12-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-10
                相关资源
                最近更新 更多