我正在將一段舊代碼從 Moment 遷移到 Luxon 并遇到以下函式:
export const TIME_FORMATTER = {
HOUR: (t) => moment(t).format('hh:mm'),
DAY: (t) => moment(t).format('M/DD'),
HOUR_PERIOD: (t) => moment(t).format('hh:mm A'),
DAY_HOUR_PERIOD: (t) => moment(t).format('hh:mm A M/DD'),
SEC: (t) => moment(t).format('HH:mm:ss')
};
呼叫如下:
export const getFormatterByTimeInterval = (timeInterval: number) => {
if (timeInterval <= 240) {
return TIME_FORMATTER.DAY_HOUR_PERIOD;
}
else if (timeInterval > 480) {
return TIME_FORMATTER.HOUR_PERIOD;
}
else {
return TIME_FORMATTER.DAY;
}
}
我最初的想法是使用與 Luxon 相同的呼叫格式:
const TIME_FORMATTER_LUXON = {
HOUR: (t) => DateTime.local(t).toFormat("hh:mm"),
DAY: (t) => DateTime.local(t).toFormat("M/d"),
HOUR_PERIOD: (t) => DateTime.local(t).toFormat("t"),
DAY_HOUR_PERIOD: (t) => DateTime.local(t).toFormat("t M/d"),
SEC: (t) => DateTime.local(t).toFormat("HH:mm:ss")
};
這被另一個檔案呼叫,const formatter = getFormatterByTimeInterval(timeInterval);但它正在回傳Invalid DateTime
Luxon 有可能嗎?可能是什么問題?
uj5u.com熱心網友回復:
在我看來,您的舊代碼可能存在一些問題,所以我想在回答您的問題之前至少解決它們:
moment唯一接受number引數的函式簽名是Unix Timestamp (milliseconds):
與 類似,您可以通過傳遞一個表示自 Unix 紀元(1970 年 1 月 1 日 12AM UTC)以來的毫秒
new Date(Number)數的整數值來創建時刻。const day = moment(1318781876406);注意:ECMAScript 將此稱為“時間值”
我不確定timeInterval引數在您的格式化程式決議器函式中代表什么:
function getFormatterByTimeInterval (timeInterval: number) {/* ... */}
但我暫時忽略它。有了這個,讓我們看看條件:
export const getFormatterByTimeInterval = (timeInterval: number) => {
// This formats as time and date information
if (timeInterval > 240) {
return TIME_FORMATTER.DAY_HOUR_PERIOD;
}
// This formats as time-only information
// Also, this will never match because any `timeInterval` value which is
// greater than 480 is also greater than 240, so the first conditional above
// will match and return before reaching this one
else if (timeInterval > 480) {
return TIME_FORMATTER.HOUR_PERIOD;
}
// Shorter than either of the above
// This formats as date-only information
else {
return TIME_FORMATTER.DAY;
}
}
我不確定您的程式應該如何作業,但這對我來說似乎不是預期的行為。
關于您的轉換問題:
從毫秒型別Luxon實體化 a的等價物是. (您無需擔心使用該方法,因為 luxon 默認使用您系統的本地時區。)DateTimenumberDateTime.fromMillis()local
關于等效的格式化選項,它們將是:
| 片刻 | 盧克森 |
|---|---|
hh:mm |
hh:mm |
M/DD |
L/dd |
hh:mm A |
hh:mm a |
hh:mm A M/DD |
hh:mm a L/dd |
HH:mm:ss |
HH:mm:ss |
用代碼表示,它看起來像這樣:
import {DateTime} from 'luxon';
export const TIME_FORMATTER = {
HOUR: (millis: number) => DateTime.fromMillis(millis).toFormat('hh:mm'),
DAY: (millis: number) => DateTime.fromMillis(millis).toFormat('L/dd'),
HOUR_PERIOD: (millis: number) => DateTime.fromMillis(millis).toFormat('hh:mm a'),
DAY_HOUR_PERIOD: (millis: number) => DateTime.fromMillis(millis).toFormat('hh:mm a L/dd'),
SEC: (millis: number) => DateTime.fromMillis(millis).toFormat('HH:mm:ss'),
};
然后,對您的決議器進行一個小重構:
type FormatterFn = (millis: number) => string;
export const getFormatterByTimeInterval = (timeInterval: number): FormatterFn => {
let key: keyof typeof TIME_FORMATTER;
// I'm still not sure about these conditionals,
// but this order matches longest duration first
if (timeInterval > 480) key = 'HOUR_PERIOD';
else if (timeInterval > 240) key = 'DAY_HOUR_PERIOD';
else key = 'DAY';
return TIME_FORMATTER[key];
};
你可以像這樣檢查它:
// The time you asked this question
const millis = DateTime.fromISO('2022-03-21T21:02:03Z').toMillis();
// Check each conditional range:
for (const timeInterval of [500, 300, 100]) {
const formatter = getFormatterByTimeInterval(timeInterval);
console.log(formatter(millis));
}
TypeScript Playground 中的代碼
來自 TS 游樂場鏈接的已編譯 JavaScript 演示:
顯示代碼片段
<script type="module">
import {DateTime} from 'https://unpkg.com/[email protected]/src/luxon.js';
export const TIME_FORMATTER = {
HOUR: (millis) => DateTime.fromMillis(millis).toFormat('hh:mm'),
DAY: (millis) => DateTime.fromMillis(millis).toFormat('L/dd'),
HOUR_PERIOD: (millis) => DateTime.fromMillis(millis).toFormat('hh:mm a'),
DAY_HOUR_PERIOD: (millis) => DateTime.fromMillis(millis).toFormat('hh:mm a L/dd'),
SEC: (millis) => DateTime.fromMillis(millis).toFormat('HH:mm:ss'),
};
export const getFormatterByTimeInterval = (timeInterval) => {
let key;
// I'm still not sure about these conditionals,
// but this order matches longest duration first
if (timeInterval > 480)
key = 'HOUR_PERIOD';
else if (timeInterval > 240)
key = 'DAY_HOUR_PERIOD';
else
key = 'DAY';
return TIME_FORMATTER[key];
};
// The time you asked this question
const millis = DateTime.fromISO('2022-03-21T21:02:03Z').toMillis();
// Check each conditional range:
for (const timeInterval of [500, 300, 100]) {
const formatter = getFormatterByTimeInterval(timeInterval);
console.log(timeInterval, formatter(millis));
}
</script>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448024.html
標籤:javascript 约会时间 时刻 卢克森
上一篇:構造不重疊的日期時間記錄(開始,結束日期時間)資料框
下一篇:如何在熊貓中浮動物件?
