For AI agents: the complete documentation index is available at https://open-spaced-repetition.github.io/ts-fsrs/zh-TW/llms.txt, the full documentation bundle is available at https://open-spaced-repetition.github.io/ts-fsrs/zh-TW/llms-full.txt, and this page is available as Markdown at https://open-spaced-repetition.github.io/ts-fsrs/zh-TW/guide/chrono/date.md.
  • 繁體中文
  • Date

    DefaultScheduler 使用 dateChrono。它的時間 schema 接受有效的 Date 物件,因此呼叫排程器前,應先將儲存的字串或時間戳記轉換為 Date。目前的 schema 也會拒絕 new Date(0)(Unix 紀元起點)和無效日期。

    在排程器 config 頂層設定 fractionalDays(預設 false)。直接呼叫時需傳入 dateChrono.create({ config: { fractionalDays: false } })。設為 false 時,同一 UTC 日期內的時間差為零,23:00 到次日 01:00 的日期差為一天;設為 true 時,這兩小時得到 2 / 24 天。add(from, 0.5) 始終增加十二小時。精確比較先後請使用 compare。

    normalize 如何參與排程

    normalize 將 card 或 revlog 的欄位轉換為 { previous, current }。對於 Date 和 Temporal 預設:

    • 複習時,normalize 回傳 previous: card.lastReviewAt 和 current: card.dueAt。
    • 經過天數為 difference(previous ?? current, now);New 卡片始終為零。
    • 新 card 保存 dueAt: add(now, interval) 和 lastReviewAt: now。
    • revlog 保存複習前 card 的 dueAt、lastReviewAt,以及本次複習的 reviewTime: now。
    • 撤銷時,normalize 回傳 previous: revlog.lastReviewAt 和 current: revlog.dueAt,用於還原複習前 card 的時間欄位;New 卡片還原為 lastReviewAt: null。

    執行預設

    import { 
    const dateChrono: Chrono<{
        readonly time: SRSSchema<{
            input: Date;
            output: Date;
        }>;
        readonly config: SRSSchema<{
            input: {
                readonly fractionalDays?: boolean | undefined;
            };
            output: {
                readonly fractionalDays: boolean;
            };
        }>;
        readonly fields: {
            readonly card: SRSSchema<{
                input: {
                    dueAt: Date;
                    lastReviewAt?: (Date | null) | undefined;
                };
                output: {
                    dueAt: Date;
                    lastReviewAt: Date | null;
                };
            }>;
            readonly revlog: SRSSchema<{
                input: {
                    dueAt: Date;
                    lastReviewAt?: (Date | null) | undefined;
                    reviewTime: Date;
                };
                output: {
                    dueAt: Date;
                    lastReviewAt: Date | null;
                    reviewTime: Date;
                };
            }>;
        };
    }>
    dateChrono
    } from 'ts-fsrs'
    const
    const clock: ChronoCore<Date>
    clock
    =
    const dateChrono: Chrono<{
        readonly time: SRSSchema<{
            input: Date;
            output: Date;
        }>;
        readonly config: SRSSchema<{
            input: {
                readonly fractionalDays?: boolean | undefined;
            };
            output: {
                readonly fractionalDays: boolean;
            };
        }>;
        readonly fields: {
            readonly card: SRSSchema<{
                input: {
                    dueAt: Date;
                    lastReviewAt?: (Date | null) | undefined;
                };
                output: {
                    dueAt: Date;
                    lastReviewAt: Date | null;
                };
            }>;
            readonly revlog: SRSSchema<{
                input: {
                    dueAt: Date;
                    lastReviewAt?: (Date | null) | undefined;
                    reviewTime: Date;
                };
                output: {
                    dueAt: Date;
                    lastReviewAt: Date | null;
                    reviewTime: Date;
                };
            }>;
        };
    }>
    dateChrono
    .
    Chrono<{ readonly time: SRSSchema<{ input: Date; output: Date; }>; readonly config: SRSSchema<{ input: { readonly fractionalDays?: boolean | undefined; }; output: { readonly fractionalDays: boolean; }; }>; readonly fields: { readonly card: SRSSchema<{ input: { dueAt: Date; lastReviewAt?: (Date | null) | undefined; }; output: { dueAt: Date; lastReviewAt: Date | null; }; }>; readonly revlog: SRSSchema<{ input: { dueAt: Date; lastReviewAt?: (Date | null) | undefined; reviewTime: Date; }; output: { dueAt: Date; lastReviewAt: Date | null; reviewTime: Date; }; }>; }; }>.create: (ctx: {
        readonly config: {
            readonly fractionalDays: boolean;
        };
    }) => ChronoCore<Date>
    create
    ({ config: { fractionalDays: false } })
    const from = new Date('2026-01-01T23:00:00.000Z') const to = new Date('2026-01-02T01:00:00.000Z') console.log( JSON.stringify({ elapsedDays:
    const clock: ChronoCore<Date>
    clock
    .
    ChronoCore<Date>.difference: (from: Date, to: Date) => number

    Returns the distance from the previous review time to the current time.

    difference
    (from, to),
    halfDayLater:
    const clock: ChronoCore<Date>
    clock
    .
    ChronoCore<Date>.add: (from: Date, days: number) => Date
    add
    (from, 0.5).toISOString(),
    order:
    const clock: ChronoCore<Date>
    clock
    .
    ChronoCore<Date>.compare?: ((left: Date, right: Date) => number) | undefined

    Compares two time values in chronological order.

    Returns a negative number when left is earlier than right, zero when they are equal, and a positive number when left is later than right. Callers decide how to compare values when a chronology omits this method.

    compare
    ?.(from, to),
    }) )

    跨過午夜時,UTC 日期差為一天;增加半天則讓時間往後移動十二小時。