我處于一個奇怪的情況,我想計算一個日期是否在另外兩個日期之間,但只有日期和月份。
示例(帶 dd/mm):
- 今天日期:17/01
- 第一時間:01/11
- SecondInterval : 19/01
應該是真的。
這個例子:
- 今天日期:17/01
- 第一間隔 : 06/06
- SecondInterval : 08/08
應該是假的
有沒有簡單的方法來處理這個?我真的不知道如何處理這些日期的年份。
謝謝
uj5u.com熱心網友回復:
使用java.time.MonthDay類來表示日期。它有類似isAfter(),isBefore()和compareTo()比較兩個實體的方法。
一個問題是如何處理期間涵蓋一年更改的情況,即開始日期晚于結束日期時的情況。
boolean checkInterval(String testDate, String startDate, String endDate) {
var format = DateTimeFormatter.ofPattern("dd/MM");
var test = MonthDay.parse(testDate, format);
var start = MonthDay.parse(startDate, format);
var end = MonthDay.parse(endDate, format);
if (end.isBefore(start)) {
// end must be in *next* year
return !(test.isBefore(start) && test.isAfter(end));
} else {
// start and end on same year
return !(test.isBefore(start) || test.isAfter(end));
}
}
因為如果s 相等,isAfter()andisBefore()回傳 false ,代碼使用而不是,反之亦然。(如果s 相等或第一個 ( )在引數之前將回傳- 在數學上與 相同)MonthDay! isAfter()isBefore()! isAfter()trueMonthDaythisx >= ynot(x < y)
uj5u.com熱心網友回復:
這是一種方法:
boolean isDateBetween(String dateToTest, String lowerDate, String upperDate) {
int anyYear = 2000;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate d1 = LocalDate.parse(lowerDate "/" anyYear, formatter);
LocalDate d2 = LocalDate.parse(upperDate "/" anyYear, formatter);
if (d2.isBefore(d1)) {
d1 = d1.minusYears(1);
}
LocalDate testDate = LocalDate.parse(dateToTest "/" anyYear, formatter);
return testDate.isEqual(d1) || testDate.isAfter(d1) && (testDate.isEqual(d2) || testDate.isBefore(d2));
}
測驗:
boolean result1 = isDateBetween("17/01", "01/11", "19/01");
boolean result2 = isDateBetween("17/01", "06/06", "07/08");
System.out.println(result1);
System.out.println(result2);
印刷:
true
false
沒有正確測驗它,但它應該可以作業。
uj5u.com熱心網友回復:
省略年份時,FirstInterval和之間的最大跨度SecondInterval為 12 個月。
樣本使用日/月組合,允許假設所有日期都在同一年。這意味著FirstInterval可能永遠不會大于SecondInterval,否則期間的結束必須在下一年。
但在這種情況下,無法確定是否todayDate適合該時期,因為它可能屬于“本”年或“下”年(我們不知道哪個是正確的)。
因此,為了能夠獲得確定性的輸出,我們必須假設所有三個日期都是同一年的。
解決方案可能如下所示:
public final boolean isDateBetween( final String todayDate, final String firstInterval, final String secondInterval )
{
var formatter = DateTimeFormatter.ofPattern("dd/MM");
var lowerRange = MonthDay.parse( firstInterval, formatter );
var upperRange = MonthDay.parse( secondInterval, formatter );
if( !upperRange.isAfter( lowerRange ) ) throw new Error();
var testDate = MonthDay.parse( todayDate, formatter );
var retValue = !testDate.isBefore( lowerRange ) && !testDate.isAfter( upperRange );
return retValue;
}
當然,這里缺少適當的錯誤處理,需要添加。
但是讓我們假設時間范圍的含義類似于“一年中的季節”,我們想知道 atodayDate是否在冬季。
這樣的解決方案可能如下所示:
public final boolean isDayInSeason( final String today, final String begin, final String end )
{
boolean retValue = false;
var formatter = DateTimeFormatter.ofPattern("dd/MM");
var lowerRange = MonthDay.parse( begin, formatter );
var upperRange = MonthDay.parse( end, formatter );
if( !upperRange.isAfter( lowerRange ) )
{
retValue = isDayInSeason( today, lowerRange, "31/12" ) || isDayInSeason( today, "01/01", upperRange );
}
else
{
var testDate = MonthDay.parse( todayDate, formatter );
retValue = !testDate.isBefore( lowerRange ) && !testDate.isAfter( upperRange );
}
return retValue;
}
uj5u.com熱心網友回復:
將3個日期的日月提取為6個變數,如:dd1、mm1、dd2、mm2、dd3和mm3。
獲得這些數字后,請在 if 陳述句中進行簡單的數字比較。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414504.html
標籤:
