C# 如何根据当前日期时间发现财政年度?
我需要一个基于当前或今天日期时间的财政年度 假设如果我们考虑今天的日期是“代码> 2011年4月10日<代码>,那么我需要输出为<代码>财政年度2012 ,并且在某些情况下,我需要以简短的格式显示相同的输出,如<代码> FY12。我想展示两种方式 在我们的要求中,考虑的财政年度是从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
四月(当前年度)到三月(下一年度)
基于当前日期时间…输出场景取决于当前日期时间在以下所述期间或持续时间内
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);
}
}