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

C# 如何根据当前日期时间发现财政年度?,c#,asp.net,regex,linq,.net-3.5,C#,Asp.net,Regex,Linq,.net 3.5,我需要一个基于当前或今天日期时间的财政年度 假设如果我们考虑今天的日期是“代码> 2011年4月10日,那么我需要输出为财政年度2012 ,并且在某些情况下,我需要以简短的格式显示相同的输出,如 FY12。我想展示两种方式 在我们的要求中,考虑的财政年度是从四月(当前年度)到三月(下一年度) 基于当前日期时间…输出场景取决于当前日期时间在以下所述期间或持续时间内 From 01April2011 to 31March2012 - Financial Year 2012 or FY2012 Fro

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

假设如果我们考虑今天的日期是“代码> 2011年4月10日<代码>,那么我需要输出为<代码>财政年度2012 ,并且在某些情况下,我需要以简短的格式显示相同的输出,如<代码> FY12。我想展示两种方式

在我们的要求中,考虑的财政年度是从
四月(当前年度)到
三月(下一年度)

基于当前日期时间…输出场景取决于当前日期时间在以下所述期间或持续时间内

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日,那么输出需要设置为2013财年和2013财年


请帮助我如何在C#,.Net3.5中使用LINQ或Regex以非常短的格式实现相同的功能。我以前通过创建一个
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();
    }
}
公共类财务年度
{
整数;
私有静态只读int firstMonthInYear=4;
公共静态财务年度当前
{
获取{return new FinancialYear(DateTime.Today);}
}
公共财政年度(日期时间forDate)
{
如果(forDate.Month
其他要点:

  • 查看IFormatProvider,了解如何自定义格式(您可以提供一个ToString重载,它像DateTime一样使用格式参数)
  • 重写Equals,并实现IEquitable以提供相等
  • 实现IComparable以获得一致性

  • 您还可以实现自己的==<>>=和我不确定为什么需要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"));
    
    DateTime today=DateTime.today;
    
    if(today.Month2种扩展方法

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

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

    //
    ///财政年度开始时的延期方法
    ///     
    公共静态日期时间GetStartOfFinancialYear(此日期时间日期,int startMonthOfFinancialYear)
    {
    如果(开始财务年度的月数<1 | |开始财务年度的月数>12)
    抛出新的ArgumentException(“必须介于1和12之间”、“startMonthOfFinancialYear”);
    DateTime rtn=新的日期时间(date.Year,StartMonthof FinancialYear,1);
    如果(日期月<开始月财务年度)
    {
    //当前财年从去年开始-例如,从4月到3月财年,然后是2013年2月1日财年从4月1日开始20*12*
    rtn=rtn.增加年(-1);
    }
    返回rtn;
    }
    //例如,财政年度从7月开始
    DateTime startFY=DateTime.Now.GetStartOfFinancialYear(7);
    DateTime endFY=startFY.AddYears(1.AddDays(-1);
    
    要改进Russ的上述答案,我建议:

    • 将2个扩展方法合并为1个通用加法逻辑
    • 为短/长和月份添加参数(有些需要十月而不是四月)
    • 添加默认值
    • 省略“财政年度”,因为有些人可能使用“财政年度”
  • 如果4月是您的新财年,并且您希望缩短,请使用
    .tofysting()
  • 如果10月是您的新财年,您希望短时间使用
    .tofysting(月限:9)
  • 如果4月是您的新财年,并且您想要延长,请使用
    .ToFYString(true)
  • 如果10月是您的新财年,并且您希望延长,请使用
    .ToFYString(true,9)

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

            string FinYear=null;
    
            if (DateTime.Today.Month > 3)
            {
    
                FinYear = "1/4/" + DateTime.Today.Year;
            }
    
            else
            {
                FinYear = "1/4/" + (DateTime.Today.Year - 1);
            }
    
    这里使用的是有值元组(财政年度从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);
            }
            
        }
    

    这与LINQ和Regex有什么关系?如果其他代码对您有效,这不简单吗?这段代码中的endFY几乎一整天都会出错。财政年度结束时将是startFY.AddYears(1)。AddTicks(-1)要获得23:59:59.9999999…您的代码将给出财政年度最后一天的开始,而不是结束。这如何回答问题?
    
    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));
    }
    
            string FinYear=null;
    
            if (DateTime.Today.Month > 3)
            {
    
                FinYear = "1/4/" + DateTime.Today.Year;
            }
    
            else
            {
                FinYear = "1/4/" + (DateTime.Today.Year - 1);
            }
    
    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);
            }
            
        }