#Temporal Instant
timezone と fractionalDays はスケジューラーの config 直下に指定します。例:config: { ...modelConfig, timezone: 'Asia/Tokyo', fractionalDays: false }。両方を省略するとデフォルトの 'UTC' と false を使用します。直接呼ぶ場合は完全な設定を渡します:temporalInstantChrono.create({ config: { timezone: 'Asia/Tokyo', fractionalDays: false } })。スケジューラーの生成時には設定の検証とデフォルト値の補完が行われます。
fractionalDays: false では指定したタイムゾーンの暦日差を計算し、true ではそのタイムゾーンでの日数の小数部分も含めます。add は UTC では1日を24時間として加算し、それ以外のタイムゾーンでは暦日を加算します。夏時間の切り替えをまたぐと、現地の1日は24時間より短く、または長くなることがあります。小数部分の加算には、隣接する現地の日の実際の長さを使います。このプリセットでは、1日の切り替え時刻を任意の時刻に設定することはできません。
#プリセットを実行する
アプリケーションに temporal-polyfill をインストールします。この例は Chrono の作成前にグローバルエントリーポイントを読み込み、実行環境にネイティブの Temporal がない場合だけ polyfill を適用します。2つ目の import はグローバルな TypeScript 型宣言を読み込みます。
npm install temporal-polyfillyarn add temporal-polyfillpnpm add temporal-polyfillbun add temporal-polyfilldeno add npm:temporal-polyfillimport 'temporal-polyfill/global'
import 'temporal-polyfill/types/global'
import { const temporalInstantChrono: Chrono<{
readonly time: SRSSchema<{
input: Temporal.Instant;
output: Temporal.Instant;
}>;
readonly config: SRSSchema<{
input: {
readonly timezone?: string | undefined;
readonly fractionalDays?: boolean | undefined;
};
output: {
readonly timezone: string;
readonly fractionalDays: boolean;
};
}>;
readonly fields: {
readonly card: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
};
}>;
readonly revlog: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
reviewTime: Temporal.Instant;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
reviewTime: Temporal.Instant;
};
}>;
};
}>
temporalInstantChrono } from 'ts-fsrs'
const const clock: ChronoCore<Temporal.Instant> clock = const temporalInstantChrono: Chrono<{
readonly time: SRSSchema<{
input: Temporal.Instant;
output: Temporal.Instant;
}>;
readonly config: SRSSchema<{
input: {
readonly timezone?: string | undefined;
readonly fractionalDays?: boolean | undefined;
};
output: {
readonly timezone: string;
readonly fractionalDays: boolean;
};
}>;
readonly fields: {
readonly card: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
};
}>;
readonly revlog: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
reviewTime: Temporal.Instant;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
reviewTime: Temporal.Instant;
};
}>;
};
}>
temporalInstantChrono .Chrono<{ readonly time: SRSSchema<{ input: Temporal.Instant; output: Temporal.Instant; }>; readonly config: SRSSchema<{ input: { readonly timezone?: string | undefined; readonly fractionalDays?: boolean | undefined; }; output: { readonly timezone: string; readonly fractionalDays: boolean; }; }>; readonly fields: { readonly card: SRSSchema<{ input: { dueAt: Temporal.Instant; lastReviewAt?: (Temporal.Instant | null) | undefined; }; output: { dueAt: Temporal.Instant; lastReviewAt: Temporal.Instant | null; }; }>; readonly revlog: SRSSchema<{ input: { dueAt: Temporal.Instant; lastReviewAt?: (Temporal.Instant | null) | undefined; reviewTime: Temporal.Instant; }; output: { dueAt: Temporal.Instant; lastReviewAt: Temporal.Instant | null; reviewTime: Temporal.Instant; }; }>; }; }>.create: (ctx: {
readonly config: {
readonly timezone: string;
readonly fractionalDays: boolean;
};
}) => ChronoCore<Temporal.Instant>
create ({
config: { timezone: 'America/New_York', fractionalDays: false },
})
const const fractionalClock: ChronoCore<Temporal.Instant> fractionalClock = const temporalInstantChrono: Chrono<{
readonly time: SRSSchema<{
input: Temporal.Instant;
output: Temporal.Instant;
}>;
readonly config: SRSSchema<{
input: {
readonly timezone?: string | undefined;
readonly fractionalDays?: boolean | undefined;
};
output: {
readonly timezone: string;
readonly fractionalDays: boolean;
};
}>;
readonly fields: {
readonly card: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
};
}>;
readonly revlog: SRSSchema<{
input: {
dueAt: Temporal.Instant;
lastReviewAt?: (Temporal.Instant | null) | undefined;
reviewTime: Temporal.Instant;
};
output: {
dueAt: Temporal.Instant;
lastReviewAt: Temporal.Instant | null;
reviewTime: Temporal.Instant;
};
}>;
};
}>
temporalInstantChrono .Chrono<{ readonly time: SRSSchema<{ input: Temporal.Instant; output: Temporal.Instant; }>; readonly config: SRSSchema<{ input: { readonly timezone?: string | undefined; readonly fractionalDays?: boolean | undefined; }; output: { readonly timezone: string; readonly fractionalDays: boolean; }; }>; readonly fields: { readonly card: SRSSchema<{ input: { dueAt: Temporal.Instant; lastReviewAt?: (Temporal.Instant | null) | undefined; }; output: { dueAt: Temporal.Instant; lastReviewAt: Temporal.Instant | null; }; }>; readonly revlog: SRSSchema<{ input: { dueAt: Temporal.Instant; lastReviewAt?: (Temporal.Instant | null) | undefined; reviewTime: Temporal.Instant; }; output: { dueAt: Temporal.Instant; lastReviewAt: Temporal.Instant | null; reviewTime: Temporal.Instant; }; }>; }; }>.create: (ctx: {
readonly config: {
readonly timezone: string;
readonly fractionalDays: boolean;
};
}) => ChronoCore<Temporal.Instant>
create ({
config: { timezone: 'America/New_York', fractionalDays: true },
})
// Noon in New York, the day before daylight saving time starts.
const from = Temporal.Instant.from('2026-03-07T17:00:00Z')
const next = const clock: ChronoCore<Temporal.Instant> clock .ChronoCore<Temporal.Instant>.add: (from: Temporal.Instant, days: number) => Temporal.Instant add (from, 1)
const halfDay = const clock: ChronoCore<Temporal.Instant> clock .ChronoCore<Temporal.Instant>.add: (from: Temporal.Instant, days: number) => Temporal.Instant add (from, 0.5)
console.log(
JSON.stringify(
{
nextDayUTC: next.toString(),
elapsedHours: from.Temporal.Instant.until(other: Temporal.InstantLike, options?: Temporal.RoundingOptionsWithLargestUnit<Temporal.TimeUnit>): Temporal.Duration (+1 overload) until (next).Temporal.Duration.total(totalOf: Temporal.PluralizeUnit<Temporal.DateUnit | Temporal.TimeUnit>): number (+3 overloads) total ('hours'),
calendarDays: const clock: ChronoCore<Temporal.Instant> clock .ChronoCore<Temporal.Instant>.difference: (from: Temporal.Instant, to: Temporal.Instant) => numberReturns the distance from the previous review time to the current time.
difference (from, next),
fractionalDays: const fractionalClock: ChronoCore<Temporal.Instant> fractionalClock .ChronoCore<Temporal.Instant>.difference: (from: Temporal.Instant, to: Temporal.Instant) => numberReturns the distance from the previous review time to the current time.
difference (from, halfDay),
},
null,
2
)
)
ニューヨークの3月7日正午は 17:00 UTC です。現地の暦日を1日加算すると3月8日正午、つまり 16:00 UTC になります。夏時間が始まるため、実際の経過時間は23時間です。fractionalDays: true は半日の加算を 0.5 として計算します。