我正在從 Momentjs 遷移到 Luxon。我允許用戶選擇任務將花費的小時數。當我們保存這個值時,我希望它正常化。因此,如果一項任務需要 90 小時,我希望我們存盤 3 天 18 小時。我存盤了 ISO 持續時間字串,所以我想將 PT90H 轉換為 P3DT18H ......當然可以使用任何給定的值。
我試過 Luxon 的normalize功能,我試著這樣稱呼它:
const duration = Duration.fromObject({ hours: 90 });
duration.normalize().toISO();
但是,normalize似乎對結果沒有任何作用。我仍然得到PT90H。Luxon 是否有內置的方法來做到這一點?
uj5u.com熱心網友回復:
Durtation.normalize()不會向 Duration 物件添加屬性,因此您需要提供您希望它標準化的單位。(這對我來說很奇怪,但提供了對結果的隱式控制)。
normalize() – 將此 Duration 減少為其當前單位的規范表示。
const duration = Duration
.fromObject({ days: 0, hours: 90 })
.normalize()
.toISO();
console.log(duration);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>
<script>const { Duration } = luxon;</script>
或者,您可以使用Duration.shiftTo()明確將持續時間強制為特定單位。
const duration = Duration
.fromObject({hours: 90 })
.shiftTo('days', 'hours')
.toISO();
console.log(duration);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>
<script>const { Duration } = luxon;</script>
如果您知道您總是希望標準化為所有單位,您可以宣告一個實用程式來回傳一個用所有單位初始化的 Duration 物件。
顯示代碼片段
function createDuration(duration) {
return Duration.fromObject(
Object.assign(
{ years: 0, months: 0, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 },
duration
)
);
}
const duration = createDuration({ hours: 90, minutes: 3004 }).normalize().toISO();
console.log(duration);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>
<script>const { Duration } = luxon;</script>
uj5u.com熱心網友回復:
根據@pilchard 的回答,我最終使用這個函式來規范我的持續時間。
function normalize(duration) {
const durationObject = duration.shiftTo(
'years',
'months',
'days',
'hours',
'minutes',
'seconds'
).toObject();
// filter out units with 0 values.
const resultObject = Object.keys(durationObject).reduce((result, key) => {
const value = durationObject[key];
return value ? { ...result, [key]: value } : result;
}, {});
return Duration.fromObject(resultObject);
}
console.log(normalize(Duration.fromObject({ hours: 90 })));
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>
<script>const { Duration } = luxon;</script>
[編輯] 過濾掉 0'ed 單位的步驟對于我的既定目標來說是不需要的,該toISO方法為我們做到了這一點。我的需求與使規范通過有關,似乎更改規范比在計算程序中浪費 CPU 周期標準化更好。使用上述方法將使生成的 ISO 持續時間字串標準化單位 -PT1H30M而不是PT90M.
最后,我選擇不使用 0-unit 過濾,并在我將其轉換為 ISO 字串時允許這種情況發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380705.html
標籤:javascript 日期 卢克森
