1. ホーム
  2. java

[解決済み] Java文字列→日付変換

2022-03-23 11:39:28

質問

を変換する最も良い方法は何ですか? String 2010年1月2日'という書式で Date をJavaで作成しますか?

最終的には、月、日、年を整数値として分解して

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

で日付を時刻に変換します。

解決方法は?

それは難しい方法で、それらの java.util.Date のセッターメソッドは、Java 1.1 (1997) 以降、非推奨とされています。さらに、全体の java.util.Date が導入されて以来、事実上非推奨(discommended)になっています。 java.time Java 8(2014年)のAPI。

日付の書式を設定するには DateTimeFormatter を、入力文字列にマッチするパターンで指定します ( チュートリアルはこちら ).

入力文字列として "January 2, 2010" を指定した場合の例です。

  1. 1月は全文が表示される月なので MMMM パターン
  2. 2"2"は短い月日なので、この場合は d パターンを使用します。
  3. "2010"は4桁の年なので yyyy のパターンを使用します。
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

注意:もし、フォーマットパターンに時間の部分が含まれている場合は、次のようにします。 LocalDateTime#parse(text, formatter) の代わりに LocalDate#parse(text, formatter) . また、フォーマットパターンにタイムゾーンも含まれる場合は、次のようにします。 ZonedDateTime#parse(text, formatter) の代わりに

以下は、関連性のある部分を抜粋したものです。 javadoc 利用可能なすべてのフォーマットパターンをリストアップしています。

<テーブル シンボルマーク 意味 プレゼンテーション 事例紹介 G 時代 テキスト AD; Anno Domini; A u 年 年 2004; 04 y 年 年 2004; 04 D 年日 番号 189 M / L 年 月 数値/テキスト 7; 07; Jul; 7月; J d 月中日 番号 10 Q / q 年四半期 数値/テキスト 3; 03; Q3; 第3四半期 Y 週単位の年 年 1996; 96 w ウィークリーベースイヤー 番号 27 W 月中 番号 4 E 曜日指定 テキスト 火; 火曜日; T e / c ローカライズされた曜日 番号/テキスト 2; 02; 火; 火曜日; T F 月中 番号 3 a 平日午前 テキスト 位相変調方式 h ちょうこくとう 番号 12 K 時分割 番号 0 k 時分秒 番号 0 H じぶん 番号 0 m おうじ 番号 30 s 秒殺 番号 55 S 秒進分率 はした 978 A ミリメートルオーダーの日 番号 1234 n ナノ秒 番号 987654321 N ナノオー日 番号 1234000000 V タイムゾーンID ゾーンID アメリカ/ロスアンゼルス; Z; -08:30 z タイムゾーン名 ゾーン名 太平洋標準時; PST O ローカライズされたゾーンオフセット オフセットO gmt+8; gmt+08:00; utc-08:00; X ゾーンオフセット 'Z' (ゼロの場合 オフセット-X Z; -08; -0830; -08:30; -083015; -08:30:15; x ゾーンオフセット オフセット-x +0000; -08; -0830; -08:30; -083015; -08:30:15; Z ゾーンオフセット オフセットZ +0000; -0800; -08:00;

をいくつか持っていることに注意してください。 定義済みフォーマッタ を、より一般的なパターンに対応させることができます。そのため、例えば DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); を使用することができます。 DateTimeFormatter.RFC_1123_DATE_TIME . このようなことが可能なのは、それらが、逆に SimpleDateFormat スレッドセーフです。したがって、必要であれば、自分で定義することも可能です。

特定の入力文字列フォーマットに対して、明示的な DateTimeFormatter : 標準的な ISO 8601 のように、直接パースすることができます。 LocalDateTime#parse(text) は、すでに ISO_LOCAL_DATE_TIME フォーマッタを使用します。同様に LocalDate#parse(text) は ISO 日付から時刻を除いたものをパースします ( ISO_LOCAL_DATE )、および ZonedDateTime#parse(text) は、オフセットとタイムゾーンを追加した ISO 日付を解析します ( ISO_ZONED_DATE_TIME ).


プレジャパニーズ8

まだJava 8を使用していない場合や、やむを得ず java.util.Date を使用すると、日付の書式を設定することができます。 SimpleDateFormat 入力文字列と一致する書式パターンを使用する。

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

このとき、重要なのは明示的な Locale 引数を使用します。もしこれを省略した場合、それは デフォルトロケール これは、入力文字列の月名で使われている英語とは限りません。もしロケールと入力文字列が一致しない場合は、混乱することに java.text.ParseException というように、書式パターンが有効であるように見えても

以下は、関連性のある部分の抜粋です。 javadoc 利用可能なすべてのフォーマットパターンをリストアップしています。

<テーブル 手紙 日付または時刻の構成要素 プレゼンテーション 事例紹介 G 時代指定文字 テキスト 広告 y 年 年 1996; 96 Y 週年 年 2009; 09 M / L 年における月 月 7月; Jul; 07 w 年内の週 番号 27 W 月中の週 番号 2 D 年における日数 番号 189 d 月中の日数 番号 10 F 月中の曜日 番号 2 E 週内日数 テキスト 火曜日; 火 u 週の日数 番号 1 a Am/pm マーカ テキスト PM H 日中の時間(0-23) 番号 0 k 日中の時間(1〜24) 番号 24 K 午前/午後で時間(0-11) 番号 0 h 午前/午後における時間(1-12) 番号 12 m 分(1時間 数値 30 s 分単位の秒数 数値 55 S ミリ秒 数値 978 z タイムゾーン 一般的なタイムゾーン 太平洋標準時(PST)、グリニッジ標準時(GMT)-08:00 Z タイムゾーン RFC822のタイムゾーン -0800 X タイムゾーン ISO 8601タイムゾーン -08; -0800; -08:00

パターンは大文字と小文字を区別し、4文字以上のテキストベースのパターンは完全な形式を表すことに注意してください。したがって、例えば MMMMM などは不要です。

以下は、有効な SimpleDateFormat パターンを使って、与えられた文字列を解析し、日付を表示します。

<テーブル 入力文字列 パターン 2001.07.04 AD 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z 01年7月4日(水) EEE, MMM d, ''yy 午後12時8分 h:mm a 太平洋夏時間午後12時 hh 'o''clock' a, zzzz 午後0時8分、PDT K:mm a, z 02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa 2001年7月4日(水)12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z 010704120856-0700 yyMMddHHmmssZ 2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ 2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 2001-W27-3 YYYY-'W'ww-u

重要な注意点として SimpleDateFormat ではなく スレッドセーフです。言い換えれば、静的変数やインスタンス変数として宣言して代入し、それを別のメソッドやスレッドから再利用してはいけないのです。常にメソッドのローカルスコープで新規に作成する必要があります。