できない.dev

日付を書式付きの文字列にするには

日時の値を 2026-08-03 09:05:00 のような文字列へ変換する基本形を各言語で示す。
書式指定子が言語ごとに全く違う点と、ロケールやタイムゾーンに引きずられて出力が変わる点までを扱う。

公開:

各言語見出しの横のバッジは検証状態を表す。実行確認済みはコードを実際に実行して確認したもの、静的確認は構文と公式 API ドキュメントで確認したものである。

Python 実行確認済み

from datetime import datetime
 
dt = datetime(2026, 8, 3, 9, 5, 0)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))  # 2026-08-03 09:05:00
print(dt.strftime("%Y/%m/%d"))           # 2026/08/03
print(dt.isoformat())                    # 2026-08-03T09:05:00
print(f"{dt:%Y年%m月%d日}")               # f-string でも同じ書式指定子が使える

strftime に書式文字列を渡すのが基本形で、f-string の書式指定でも同じ指定子が使える。
機械的に読み書きするなら isoformat のほうが安全で、書式のゆらぎを持ち込まずに済む。

うまくいかない時: Python で datetime の naive と aware を比較できず TypeError になる

JavaScript 実行確認済み

const dt = new Date(2026, 7, 3, 9, 5, 0); // 第2引数の月は 0 始まりなので 7 が 8 月
 
const pad = (n) => String(n).padStart(2, "0");
console.log(`${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}`); // 2026-08-03
 
const f = new Intl.DateTimeFormat("ja-JP", { dateStyle: "medium", timeStyle: "short" });
console.log(f.format(dt)); // 2026/08/03 9:05
 
console.log(dt.toISOString()); // 常に UTC へ変換されるので日付がずれうる

標準の Date には任意書式への変換が無いため、固定の書式なら getFullYear 等を連結して自前で組む。
表示用の文字列なら Intl.DateTimeFormat を使うと、ロケールごとの適切な並びを自分で扱わずに済む。

TypeScript 実行確認済み

const dt: Date = new Date(2026, 7, 3, 9, 5, 0); // 第2引数の月は 0 始まり
 
function formatDate(d: Date, sep: string = "-"): string {
  const pad = (n: number): string => String(n).padStart(2, "0");
  return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join(sep);
}
 
console.log(formatDate(dt));      // 2026-08-03
console.log(formatDate(dt, "/")); // 2026/08/03
 
const opts: Intl.DateTimeFormatOptions = { dateStyle: "long" };
console.log(new Intl.DateTimeFormat("ja-JP", opts).format(dt)); // 2026年8月3日

実行時の振る舞いは JavaScript と同じで、差分は型の付け方だけである。
Intl のオプションは Intl.DateTimeFormatOptions として切り出しておくと、dateStyle の絞り違いをコンパイル時に検出できる。

Go 静的確認

package main
 
import (
	"fmt"
	"time"
)
 
func main() {
	dt := time.Date(2026, time.August, 3, 9, 5, 0, 0, time.Local)
	fmt.Println(dt.Format("2006-01-02 15:04:05")) // 参照時刻を並べて書式を表す
	fmt.Println(dt.Format("2006/01/02"))
	fmt.Println(dt.Format(time.RFC3339))
}

Go の書式は %Y のような指定子ではなく「2006-01-02 15:04:05」という参照時刻そのものを並べて表す。
数字の組み合わせに意味があるため、覚えていないうちは time.RFC3339 などの定数を使うほうが安全である。

Rust 静的確認

// Cargo.toml に chrono = "0.4" を追加する
use chrono::{Local, TimeZone};
 
fn main() {
    let dt = Local.with_ymd_and_hms(2026, 8, 3, 9, 5, 0).unwrap();
    println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));
    println!("{}", dt.format("%Y/%m/%d"));
    println!("{}", dt.to_rfc3339());
}

標準ライブラリにはカレンダー上の日付を書式化する機能が無いため、chrono クレートを依存に加えるのが一般的である。
with_ymd_and_hms は存在しない時刻(夏時間の間隙など)を考慮して LocalResult を返すので、受け取り側で展開が必要になる。

Java 静的確認

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
 
public class Main {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2026, 8, 3, 9, 5, 0);
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(dt.format(f));
        System.out.println(dt.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }
}

DateTimeFormatter のパターンは大文字と小文字で意味が別で、MM が月、mm が分である。
定型の ISO 形式なら ISO_LOCAL_DATE などの定数が用意されているので、自前のパターンを書かずに済ませる。

C# 静的確認

using System;
using System.Globalization;
 
class Program {
    static void Main() {
        var dt = new DateTime(2026, 8, 3, 9, 5, 0);
        Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
        Console.WriteLine(dt.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture));
    }
}

ToString に書式文字列を渡すのが基本形だが、区切り文字の / は実行環境のカルチャに応じて置き換えられる。
ファイル名や API の入力に使う文字列なら CultureInfo.InvariantCulture を明示して固定する。

つまずき

書式指定子は言語ごとに全く体系が違う。
Python や chrono は strftime 系の %Y-%m-%d、Java や C# は yyyy-MM-dd、Go は参照時刻を並べる 2006-01-02 であり、他言語の感覚で書くと黙って別の値が出る。
特に Java と C# は MM が月、mm が分という大文字小文字の差で意味が変わり、エラーにならない分だけ検知が遅れる。
また JavaScript の Date はコンストラクタの月が 0 始まりなので、8 月を作るには 7 を渡す必要がある。

ロケールとタイムゾーンで出力が変わる

同じコードでも実行環境によって結果が変わる点に注意する。
C# の / はカルチャの区切り文字へ置換され、JavaScript の toISOString は常に UTC へ変換するため、ローカルの 8/3 9:05 が 8/3 0:05Z のように日付ごとずれて見えることがある。
人に見せる文字列はロケールを明示した書式化 API に任せ、保存や送信に使う文字列は ISO 8601 に揃えておくと、表示とデータの関心を分けられる。