我想將按月和日標識的日期決議為DateTime
將來發生的有效日期。
假設今天是2023-05-06
,下面是輸入和輸出值表:
輸入 | 輸出 |
---|---|
06-24 |
2023-06-24 |
01-05 |
2024-01-05 |
02-29 |
2024-02-29 |
實作這一點的一種天真的方法是測驗DateTime.Now.Year
用于該Year
部分是否會產生未來的日期:
var today = DateTime.Now;
bool dateInFuture = new DateTime(today.Year, 02, 29)).CompareTo(today);
但是,您可能已經注意到這將導致例外,因為2023-02-29
它不是有效日期。
理想情況下,我希望這段代碼能夠計算出日期是否實際上無效,所以如果00-46
作為輸入傳遞,它可以告訴我這不是一個真實的日期,但這有點棘手,因為我當前的實作失敗了實際上是有效的。
uj5u.com熱心網友回復:
這是我的看法:
DateTime? GetFutureDateFromMonthDay(DateTime today, string monthDay) =>
Enumerable
.Range(today.Year, 9)
.Select(y => DateTime.TryParse($"{y}-{monthDay}", out DateTime result) ? (DateTime?)result : null)
.Where(x => x != null)
.Where(x => x > today)
.FirstOrDefault();
請注意,它向前看 9 年,因為閏年??之間可能有 8 年的差距,并且您希望確保獲得未來的日期,因此可能需要再延長一年。更改today
為new DateTime(2096, 5, 6)
顯示該問題。
所以,給定這個輸入:
var today = new DateTime(2023, 5, 6);
var data = new[]
{
new { input = "06-24", output = (DateTime?)new DateTime(2023, 6, 24) },
new { input = "01-05", output = (DateTime?)new DateTime(2024, 1, 5) },
new { input = "02-29", output = (DateTime?)new DateTime(2024, 2, 29) },
new { input = "00-46", output = (DateTime?)null },
};
我運行這個查詢:
var query =
from d in data
let expected = d.output
let actual = GetFutureDateFromMonthDay(today, d.input)
select new
{
d.input,
expected,
actual,
check = actual == expected,
};
我得到這個結果:
如果繼續嘗試,new DateTime(2096, 5, 6)
我現在得到這個:
此代碼生成未來日期或回傳null
以指示輸入錯誤。
uj5u.com熱心網友回復:
您可以使用DateTime.IsLeapYear(year)
- 如本答案所示,與DateTime.TryParse一起檢查要轉換的值是否為有效的 DateTime:
您可以在dotnetfiddle.net中測驗此代碼:
DateTime today = DateTime.Now;
Int32 year = DateTime.IsLeapYear(today.Year) ? today.Year : today.AddYears(-2).Year;
DateTime tempDate = DateTime.Now;
// String is concatenated in "yyyy-MM-dd" format:
if (!DateTime.TryParse(year.ToString() "-02-29", out tempDate))
{
// Date is not valid.
Console.WriteLine("Date (" year.ToString() "-02-29" ") is not valid");
}
else
{
// Date with "yyyy-MM-dd" format:
Console.WriteLine("Date is valid: " tempDate.ToString("yyyy-MM-dd"));
}
uj5u.com熱心網友回復:
這可能會有所幫助:
var input = "02-29";
var year = DateTime.Today.Year;
if (DateTime.TryParse($"{year}-{input}", out DateTime date))
{
var isFutureDate = date > DateTime.Now;
}
else
{
// TODO: Manage error
}
您可以為此定義一個方法:
public static bool TryGetDate(string input, out DateTime date)
{
var year = DateTime.Today.Year;
if (input == "02-29")
{
while (!DateTime.IsLeapYear(year))
{
year ;
}
}
if (DateTime.TryParse($"{year}-{input}", out date))
{
if (date < DateTime.Now)
{
date = date.AddYears(1);
}
return true;
}
return false;
}
并使用它:
var input = "02-29";
if (TryGetDate(input, out DateTime date))
{
// ...
}
else
{
// TODO: Manage error
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470811.html