Luxon 是否有内置方法来标准化持续时间?

nep*_*hiw 3 javascript date luxon

我正在从 Momentjs 迁移到 Luxon。我允许用户选择任务需要的小时数。当我们保存这个值时,我希望它能够正常化。因此,如果一项任务需要 90 小时,我更愿意存储 3 天零 18 小时。我存储 ISO 持续时间字符串,因此我想将 PT90H 转换为 P3DT18H...当然可以使用任何给定值。

我尝试过 Luxon 的normalize函数,我尝试这样调用它:

const duration = Duration.fromObject({ hours: 90 });
duration.normalize().toISO();
Run Code Online (Sandbox Code Playgroud)

然而,normalize似乎对结果没有做任何事情。我仍然得到 PT90H。Luxon 是否有内置方法可以做到这一点?

pil*_*ard 5

Durtation.normalize()不会向 Duration 对象添加属性,因此您需要提供希望其标准化的单位。(这对我来说很奇怪,但提供了对结果的隐式控制)。

\n
\n

Normalize() \xe2\x80\x93 将此 Duration 减少为其当前单位的规范表示形式。

\n
\n

\r\n
\r\n
const duration = Duration\n  .fromObject({ days: 0, hours: 90 })\n  .normalize()\n  .toISO();\n\nconsole.log(duration);
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>\n<script>const { Duration } = luxon;</script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

或者,您可以使用Duration.shiftTo()显式强制持续时间为特定单位。

\n

\r\n
\r\n
const duration = Duration\n  .fromObject({hours: 90 })\n  .shiftTo(\'days\', \'hours\')\n  .toISO();\n\nconsole.log(duration);
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>\n<script>const { Duration } = luxon;</script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


\n

如果你知道你总是想要标准化为所有单位,你可以声明一个实用程序来返回用所有单位初始化的 Duration 对象。

\n

\r\n
\r\n
function createDuration(duration) {\n  return Duration.fromObject(\n    Object.assign(\n      { years: 0, months: 0, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 },\n      duration\n    )\n  );\n}\n\nconst duration = createDuration({ hours: 90, minutes: 3004 }).normalize().toISO();\n\nconsole.log(duration);
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.2.0/luxon.min.js"></script>\n<script>const { Duration } = luxon;</script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n