如何根据当前日期时间发现财政年度
本文关键字:发现 时间 何根 当前日期 | 更新日期: 2023-09-27 18:20:19
我需要一个基于当前或今天日期时间的财政年度。
假设我们认为今天的日期是10 April 2011
,那么我需要输出为Financial Year 2012
,在某些情况下,我需要以短格式显示与FY12
相同的输出。两种方式我都想展示。
在我们的要求中,考虑的财政年度是从 基于当前日期时间。。。输出的场景取决于当前日期时间落在所述时间段或持续时间内。 等等… 另一个例子:如果我们将今天的日期时间取为2012年4月16日,那么需要输出 请帮助如何在C#中使用LINQ或Regex以极短的格式实现相同的功能。Net3.5April
(当前年度)到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
.
.
.
Financial Year 2013
和FY13
。
几个扩展方法
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));
}
- 如果四月是你的新财政年度,并且你想做空,请使用
.ToFYString()
- 如果十月是你的新财政年度,并且你想短期使用
.ToFYString(monthLimit: 9)
- 如果四月是你的新财政年度,并且你想要长期,请使用
.ToFYString(true)
- 如果十月是你的新财政年度,并且你想要长期,请使用
.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);
}
}