我需要計算可能跨越午夜的兩次時間之間的持續時間。
用例是允許用戶設定輪班計劃,例如“09:00 到 17:00”或“22:00 到 06:00”并計算約定時間
對于“09:00 到 17:00”,我可以使用:
LocalTime inAt = new LocalTime(9, 0);
LocalTime outAt = new LocalTime(17, 0);
var period = Period.Between(inAt, outAt);
結果是 8 小時,這是我正在尋找的答案。
對于“22:00 到 06:00”,周期回傳 16 小時(與引數順序無關)。
LocalTime inAt = new LocalTime(22, 0);
LocalTime outAt = new LocalTime(6, 0);
var period = Period.Between(inAt, outAt);
var period2 = Period.Between(outAt, inAt);
我猜這與夏令時有關,除非您知道日期,否則您無法確定答案總是 8 小時。如果時鐘向前走是 7 點,向后則是 9 點。
我如何確保無論使用什么LocalTime值,該時間段都會忽略任何夏令時?我是否應該使用LocalDateTime任意日期,例如 2021-01-01?
另外,我使用正確Period還是應該使用Duration?
更新
這似乎有效,但是我仍然想知道是否有更簡單的方法?
LocalTime inAt = new LocalTime(22, 0);
LocalTime outAt = new LocalTime(6, 0);
var period = Period.Between(inAt, outAt, PeriodUnits.Ticks);
LocalTime? midnightAdjustedTime = null;
if (period.Ticks < 0)
{
midnightAdjustedTime = LocalTime.Midnight period;
}
var duration = Duration.FromTicks(midnightAdjustedTime?.TickOfDay ?? period.Ticks);
uj5u.com熱心網友回復:
這與夏令時無關 - 它不能這樣做,因為一切都以LocalTime. 這是關于消極時期。
對于“22:00 到 06:00”,周期回傳 16 小時(與引數順序無關)
不,它沒有。一個回傳 16 小時,另一個回傳 -16 小時:
using NodaTime;
var start = new LocalTime(22, 0);
var end = new LocalTime(6, 0);
var startToEnd = Period.Between(start, end);
var endToStart = Period.Between(end, start);
Console.WriteLine(startToEnd);
Console.WriteLine(endToStart);
輸出:
PT-16H
PT16H
我不清楚您是如何得出兩者都回傳相同值的結論,但它們不回傳相同值的事實對于解決問題至關重要。如果周期為負數,簡單的方法就是增加 1 天(24 小時)。您獲得的代碼幾乎是正確的,但可以更簡單地完成 - 并且Ticks根本不使用該單元:
// Note: Period.ToDuration() isn't "generally safe" due to variable lengths
// of months etc, but is okay here.
var duration = startToEnd.ToDuration();
if (duration < Duration.Zero)
{
duration = Duration.FromDays(1);
}
Console.WriteLine(duration);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361502.html
