はじめに (対象読者・この記事でわかること)

この記事は、TypeScriptで日時処理を行いたい開発者、特にUNIX時間に触れる機会がある方を対象としています。Webアプリケーション開発やサーバーサイドプログラミングにおいて、タイムスタンプを扱う場面は多々あります。この記事を読むことで、TypeScriptでUNIX時間を取得する方法、Dateオブジェクトとの変換方法、タイムゾーンの扱い方について理解を深めることができます。特に、APIとの連携やデータベース操作において必要となる知識を、実践的なコード例を交えて解説します。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - TypeScriptの基本的な文法 - JavaScriptのDateオブジェクトの基本的な知識 - Node.jsの基本的な環境構築経験

UNIX時間とはなぜ重要か

UNIX時間(またはエポック秒)とは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を指します。コンピュータシステムにおいて、日時を扱う際の共通フォーマットとして広く利用されています。TypeScriptでUNIX時間を扱う主な理由は以下の通りです。

まず、データベースとの連携において、多くのシステムがタイムスタンプ形式で日時を保存しています。特にMySQLやPostgreSQLなどのRDBMSでは、TIMESTAMP型やBIGINT型でUNIX時間を保存することが一般的です。次に、API通信において、日時データをJSON形式でやり取りする際に、人間が読みやすいフォーマットよりもUNIX時間の方がパフォーマンス面で優れています。また、JavaScript/TypeScriptのDateオブジェクトは内部的にUNIX時間を基準として値を保持しているため、相互変換が容易です。

ただし、タイムゾーンの扱いには注意が必要です。JavaScriptのDateオブジェクトは、ブラウザの環境設定やNode.jsの実行環境によってタイムゾーンが異なる場合があるため、UTCで統一して扱うことが推奨されます。

TypeScriptでUNIX時間を取得・変換する実践方法

ステップ1: UNIX時間の取得

TypeScriptでUNIX時間を取得する方法はいくつかあります。最もシンプルなのはDate.now()メソッドを使用する方法です。このメソッドは現在の日時をUNIX時間(ミリ秒単位)で返します。

Typescript
// 現在のUNIX時間をミリ秒単位で取得 const currentUnixTimeMs = Date.now(); console.log(currentUnixTimeMs); // 例: 1640995200000 // DateオブジェクトからUNIX時間を取得 const now = new Date(); const currentUnixTimeFromObject = Math.floor(now.getTime() / 1000); console.log(currentUnixTimeFromObject); // 例: 1640995200

Date.now()はミリ秒単位で値を返すため、秒単位のUNIX時間が必要な場合は1000で割る必要があります。また、DateオブジェクトのgetTime()メソッドもミリ秒単位の値を返すため、同様に1000で割る必要があります。

ステップ2: UNIX時間からDateオブジェクトへの変換

UNIX時間からDateオブジェクトを作成するには、コンストラクタにミリ秒単位の値を渡します。

Typescript
// 秒単位のUNIX時間をミリ秒に変換 const unixTimeInSeconds = 1640995200; const unixTimeInMilliseconds = unixTimeInSeconds * 1000; // UNIX時間からDateオブジェクトを作成 const dateFromUnix = new Date(unixTimeInMilliseconds); console.log(dateFromUnix); // 例: 2022-01-01T00:00:00.000Z

ステップ3: 実践的な例 - APIとの連携

実際の開発では、APIから受け取ったUNIX時間をDateオブジェクトに変換して処理することが多々あります。以下にその例を示します。

Typescript
// APIレスポンスの型を定義 interface ApiResponse { id: number; title: string; createdAt: number; // UNIX時間(秒) updatedAt: number; // UNIX時間(秒) } // APIからデータを取得する関数 async function fetchPost(id: number): Promise<ApiResponse> { // 実際のAPI呼び出しは省略 const mockResponse: ApiResponse = { id, title: "TypeScriptでUNIX時間を扱う方法", createdAt: 1640995200, updatedAt: 1640995260 }; return mockResponse; } // 取得したデータを処理する関数 async function processPost(id: number) { try { const post = await fetchPost(id); // UNIX時間をDateオブジェクトに変換 const createdDate = new Date(post.createdAt * 1000); const updatedDate = new Date(post.updatedAt * 1000); // フォーマットされた日時を表示 console.log(`記事ID: ${post.id}`); console.log(`タイトル: ${post.title}`); console.log(`作成日: ${createdDate.toLocaleString('ja-JP')}`); console.log(`更新日: ${updatedDate.toLocaleString('ja-JP')}`); return { id: post.id, title: post.title, createdAt: createdDate, updatedAt: updatedDate }; } catch (error) { console.error("データの取得に失敗しました:", error); throw error; } } // 関数を実行 processPost(1);

ステップ4: 実践的な例 - データベースとの連携

データベースに日時データを保存する際にもUNIX時間は便利です。以下に、Node.jsとTypeScriptを使用してデータベースにUNIX時間で保存し、取得する例を示します。

Typescript
import { Pool } from 'pg'; // PostgreSQL用のクライアント // データベース接続プールの作成 const pool = new Pool({ user: 'your_username', host: 'localhost', database: 'your_database', password: 'your_password', port: 5432, }); // ユーザーデータの型を定義 interface UserData { id: number; name: string; createdAt: number; // UNIX時間(秒) updatedAt: number; // UNIX時間(秒) } // ユーザーをデータベースに保存する関数 async function saveUser(name: string): Promise<UserData> { const client = await pool.connect(); try { await client.query('BEGIN'); // 現在のUNIX時間を取得 const currentUnixTime = Math.floor(Date.now() / 1000); // ユーザーを保存 const result = await client.query( 'INSERT INTO users (name, created_at, updated_at) VALUES ($1, $2, $3) RETURNING *', [name, currentUnixTime, currentUnixTime] ); await client.query('COMMIT'); return { id: result.rows[0].id, name: result.rows[0].name, createdAt: result.rows[0].created_at, updatedAt: result.rows[0].updated_at }; } catch (error) { await client.query('ROLLBACK'); throw error; } finally { client.release(); } } // ユーザーをIDで取得する関数 async function getUser(id: number): Promise<UserData> { const result = await pool.query('SELECT * FROM users WHERE id = $1', [id]); if (result.rows.length === 0) { throw new Error(`User with id ${id} not found`); } return { id: result.rows[0].id, name: result.rows[0].name, createdAt: result.rows[0].created_at, updatedAt: result.rows[0].updated_at }; } // 関数を実行 (async () => { try { // ユーザーを保存 const newUser = await saveUser("山田太郎"); console.log("保存されたユーザー:", newUser); // ユーザーを取得 const fetchedUser = await getUser(newUser.id); console.log("取得したユーザー:", fetchedUser); // UNIX時間をDateオブジェクトに変換して表示 const createdDate = new Date(fetchedUser.createdAt * 1000); const updatedDate = new Date(fetchedUser.updatedAt * 1000); console.log("作成日:", createdDate.toLocaleString('ja-JP')); console.log("更新日:", updatedDate.toLocaleString('ja-JP')); } catch (error) { console.error("エラーが発生しました:", error); } finally { await pool.end(); } })();

ハマった点やエラー解決

タイムゾーンの違いによる問題

JavaScriptのDateオブジェクトは、実行環境のタイムゾーンに基づいて日時を表示します。これにより、UTCで保存されたUNIX時間をローカル時間で表示しようとすると、意図しない日時が表示されることがあります。

問題例:

Typescript
const unixTime = 1640995200; // 2022-01-01 00:00:00 UTC const date = new Date(unixTime * 1000); // 日本時間(UTC+9)で表示すると、2021年12月31日になる console.log(date.toLocaleString('ja-JP')); // 2021/12/31 09:00:00

解決策: UTCで日時を表示するように明示的に指定するか、タイムゾーンを考慮した処理を行います。

Typescript
const unixTime = 1640995200; // 2022-01-01 00:00:00 UTC const date = new Date(unixTime * 1000); // UTCで表示する方法 console.log(date.toUTCString()); // Wed, 01 Jan 2022 00:00:00 GMT // タイムゾーンを指定して表示する方法 console.log(date.toLocaleString('ja-JP', { timeZone: 'UTC' })); // 2022/01/01 09:00:00

数値と文字列の変換での注意点

APIやデータベースから取得したUNIX時間が文字列形式で返ってくる場合があります。そのまま数値演算を行おうとすると、意図しない結果になることがあります。

問題例:

Typescript
const unixTimeString = "1640995200"; const date = new Date(unixTimeString * 1000); // 文字列と数値の乗算はNaNになる console.log(date.toString()); // Invalid Date

解決策: 文字列を数値に明示的に変換してから処理を行います。

Typescript
const unixTimeString = "1640995200"; const unixTime = parseInt(unixTimeString, 10); const date = new Date(unixTime * 1000); console.log(date.toString()); // Wed Jan 01 2022 09:00:00 GMT+0900 (日本標準時)

まとめ

本記事では、TypeScriptでUNIX時間を取得・変換する方法について解説しました。

  • UNIX時間の取得方法: Date.now()Date.getTime()を使用して現在のUNIX時間を取得
  • UNIX時間からDateオブジェクトへの変換: ミリ秒単位に変換してからnew Date()でDateオブジェクトを作成
  • 実践的な活用例: APIとの連携やデータベース操作での具体的な使用例
  • タイムゾーンの扱い: UTCとローカル時間の変換方法と注意点

この記事を通して、TypeScriptでの日時処理におけるUNIX時間の取り扱い方を理解し、実際の開発で活用できるようになったことを願っています。今後は、日時のフォーマット変換やタイムゾーン変換ライブラリの活用など、より高度な日時処理の方法についても記事にする予定です。

参考資料