discriminated unionで異なるフォーマットの日付を扱う
TypeScriptで日付を扱う場合、いくつかの方法があります。
Date型を使う
最も一般的な方法は、Date
型を使うことです。Date
型は、年、月、日、時、分、秒などの情報を含むオブジェクトです。
const today = new Date();
console.log(today.getFullYear()); // 2024
console.log(today.getMonth()); // 2
console.log(today.getDate()); // 20
Date型の利点と欠点
-
利点:
- 使いやすい
-
- 型安全性があまり高くない
- 時差やタイムゾーンの処理が複雑
number型を使う
日付をミリ秒単位のタイムスタンプとして表現することもできます。
const timestamp = Date.now();
console.log(timestamp); // 1647738400000
-
- 型安全
- 比較演算などが使いやすい
-
- 人間にとってわかりにくい
- 日付操作用のメソッドがない
ライブラリを使う
日付処理をより簡単にしたい場合は、Moment.jsなどのライブラリを使うことができます。
import moment from "moment";
const today = moment();
console.log(today.format("YYYY-MM-DD")); // 2024-03-20
ライブラリの利点と欠点
-
- 日付処理が簡単
- 様々なフォーマットに対応している
-
TypeScriptで日付型を表現するには、いくつかの方法があります。それぞれの方法には利点と欠点があるので、状況に合わせて使い分けることが重要です。
Date型を使う
// 現在の日付を取得
const today = new Date();
// 年、月、日を取得
console.log(today.getFullYear()); // 2024
console.log(today.getMonth() + 1); // 3
console.log(today.getDate()); // 20
// 日付をフォーマット
const formattedDate = today.toLocaleDateString();
console.log(formattedDate); // 2024/3/20
// 日付操作
const tomorrow = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
console.log(tomorrow); // 2024-03-21
number型を使う
// 現在の日付をタイムスタンプとして取得
const timestamp = Date.now();
// タイムスタンプから日付を取得
const date = new Date(timestamp);
console.log(date); // 2024-03-20T08:27:21.123Z
// タイムスタンプの比較
const timestamp1 = Date.now();
const timestamp2 = Date.now();
if (timestamp1 > timestamp2) {
console.log("timestamp1の方が新しい");
} else {
console.log("timestamp2の方が新しい");
}
Moment.jsを使う
import moment from "moment";
// 現在の日付を取得
const today = moment();
// 日付をフォーマット
console.log(today.format("YYYY-MM-DD")); // 2024-03-20
// 日付操作
const tomorrow = moment().add(1, "days");
console.log(tomorrow.format("YYYY-MM-DD")); // 2024-03-21
// 異なるフォーマットの日付を比較
const date1 = moment("2024-03-20");
const date2 = moment("2024/03/20");
if (date1.isSame(date2)) {
console.log("同じ日付");
} else {
console.log("異なる日付");
}
- それぞれの方法には利点と欠点があるので、状況に合わせて使い分けることが重要です。
TypeScriptで日付型を表現するその他の方法
Date
オブジェクトを拡張して、独自のメソッドを追加することができます。
interface Date {
// 曜日を取得する
getDayOfWeek(): string;
}
const today = new Date();
console.log(today.getDayOfWeek()); // "水曜日"
型エイリアスを使って、日付を表す独自の型を定義することができます。
type Date = {
year: number;
month: number;
day: number;
};
const today: Date = {
year: 2024,
month: 3,
day: 20,
};
discriminated unionを使って、異なるフォーマットの日付を表す型を定義することができます。
type Date =
| {
type: "iso";
value: string;
}
| {
type: "timestamp";
value: number;
};
const date1: Date = {
type: "iso",
value: "2024-03-20",
};
const date2: Date = {
type: "timestamp",
value: Date.now(),
};
ファクトリー関数を使って、日付型オブジェクトを作成することができます。
function createDateString(year: number, month: number, day: number): string {
return `${year}-${month}-${day}`;
}
const dateString = createDateString(2024, 3, 20);
console.log(dateString); // "2024-03-20"
これらの方法は、それぞれ異なる利点と欠点があります。状況に合わせて最適な方法を選択する必要があります。
date typescript