日付を書式付きの文字列にするには
日時の値を 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 に揃えておくと、表示とデータの関心を分けられる。