> 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.

# 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`。

## 執行預設

```ts twoslash file="../../../snippets/run-code/chrono-date.ts"
import { dateChrono } from 'ts-fsrs'

const clock = dateChrono.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: clock.difference(from, to),
    halfDayLater: clock.add(from, 0.5).toISOString(),
    order: clock.compare?.(from, to),
  })
)

```


▶ 執行程式碼

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