システムの現在時刻を取得する

Recipe ID: sys-006

システムの現在時刻を取得する方法を解説します。
基本的には JavaScript の Date オブジェクトで取得できますが、Rust 側で取得した正確なシステム時刻をフロントエンドに渡す方法もあわせて紹介します。

1. JavaScript (Frontend) のみで取得する場合

Tauri の WebView は OS のシステム時刻を利用するため、標準の Date オブジェクトを使用するのが最も簡単です。

// 現在時刻の取得
const now = new Date();

// ロケールに合わせてフォーマット(例: "2023/12/31 23:59:59")
const formatted = new Intl.DateTimeFormat('ja-JP', {
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
}).format(now);

console.log(formatted);

2. Rust (Backend) から取得する場合

より厳密なシステム時刻や、ナノ秒単位の精度、あるいは OS のタイムゾーン設定に依存した処理が必要な場合は、Rust 側で時刻を取得してコマンド経由で渡します。
chrono クレートを使用するのが一般的です。

前提条件 (Rust)

src-tauri/Cargo.tomlchronoserde を追加します。

[dependencies]
tauri = { version = "2.0.0", features = [] }
serde = { version = "1.0", features = ["derive"] }
chrono = { version = "0.4.42", features = ["serde"] }

Rust 実装

use tauri::command;
use chrono::Local; // または Utc

#[command]
fn get_system_time() -> String {
    let now = Local::now();
    now.format("%Y-%m-%d %H:%M:%S").to_string()
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![get_system_time])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

フロントエンドからの呼び出し

import { invoke } from '@tauri-apps/api/core';

async function fetchServerTime() {
    const time = await invoke<string>('get_system_time');
    console.log(`Server Time: ${time}`);
}

fetchServerTime();