日時の取り扱いはプログラミングにおいてよく直面する課題の一つです。特に、異なるISO 8601形式の日時データを一つの標準形式に統一する必要がある場合、この処理はより複雑になりがちです。ISO 8601は国際的な日付および時間の表記標準であり、さまざまな形式(例えば、“2023-04-01T12:45:30Z”、“2023-04-01T12:45:30+02:00”など)を取ります。この記事では、Javaのjava.timeパッケージを使って、これらの異なる形式をUTCを基準とした一つの形式に統一する方法を紹介します。これにより、アプリケーション内での日時の扱いが簡単になり、バグの発生リスクを減らすことができます。
参考コード
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class IsoDateTimeConverter {
public static void main(String[] args) {
// ISO 8601形式の日時文字列の例
String[] dateTimes = {
"2023-04-01T12:45:30Z", // UTC形式
"2023-04-01T12:45:30", // Zがない形式
"2023-04-01T12:45:30+02:00" // オフセットが含まれる形式
};
for (String dateTime : dateTimes) {
System.out.println(convertToUtc(dateTime));
}
}
private static String convertToUtc(String isoDateTime) {
ZonedDateTime zdt = ZonedDateTime.parse(isoDateTime, DateTimeFormatter.ISO_DATE_TIME);
ZonedDateTime utc = zdt.withZoneSameInstant(java.time.ZoneOffset.UTC);
return utc.format(DateTimeFormatter.ISO_DATE_TIME);
}
}
このコードは、java.time.ZonedDateTimeとjava.time.format.DateTimeFormatterを使用して、ISO 8601形式の日時文字列を解析し、UTC形式に変換します。ZonedDateTime.parseメソッドは、様々なISO 8601形式の日時を解析でき、withZoneSameInstantメソッドを使用してUTC時刻に変換しています。これにより、異なる形式で表された日時も、プログラム内で一貫した形式で扱うことができるようになります。