Java 文字列から日付への変換 質問する

Java 文字列から日付への変換 質問する

Java でString「2010 年 1 月 2 日」という形式の を に変換する最適な方法は何ですか?Date

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

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

日付を時間に変換します。

ベストアンサー1

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

日付をフォーマットするには、DateTimeFormatter入力文字列に一致するパターン(チュートリアルはここから入手できます)。

入力文字列が「2010 年 1 月 2 日」の場合:

  1. 「1月」は完全なテキストの月なので、MMMMパターンを使用します
  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; 西暦; A
u 2004; 04
y 年号 2004; 04
D 年内の日 番号 189
M/L 数字/テキスト 7; 07; 7月; 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 午前午後の時刻 (1-12) 番号 12
K 午前-午後の時間 (0-11) 番号 0
k 午前午後の時刻 (1-24) 番号 0
H 時間 (0-23) 番号 0
m 1時間のうちの分 番号 30
s 1分のうちの秒 番号 55
S 秒の何分の一か 分数 978
A 1ミリ秒 番号 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: 標準の8601 規格2016-09-26T17:44:57Zのような日付は、次のように直接解析できます。LocalDateTime#parse(text)すでにISO_LOCAL_DATE_TIMEフォーマッタ。同様に、LocalDate#parse(text)時刻要素を除いたISO日付を解析します(ISO_LOCAL_DATE)、 そしてZonedDateTime#parse(text)オフセットとタイムゾーンが追加されたISO日付を解析します(ISO_ZONED_DATE_TIME)。


Java 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月; 7月; 07
w 年間週数 番号 27
W 月内の週 番号 2
D 年間日数 番号 189
d 月内の日 番号 10
F 月内の曜日 番号 2
E 曜日 文章 火曜日; 火曜
u 週の曜日番号 番号 1
a 午前/午後マーカー 文章 午後
H 一日の時間 (0-23) 番号 0
k 一日の時間 (1-24) 番号 24
K 午前/午後の時間 (0-11) 番号 0
h 午前/午後の時間 (1-12) 番号 12
m 1時間あたりの分数 番号 30
s 1分あたり秒 番号 55
S ミリ秒 番号 978
z タイムゾーン 一般的なタイムゾーン 太平洋標準時; PST; GMT-08:00
Z タイムゾーン RFC 822 タイムゾーン -0800
X タイムゾーン ISO 8601 タイムゾーン -08; -0800; -08:00

パターンは大文字と小文字が区別され、4 文字以上のテキスト ベースのパターンは完全な形式を表すことに注意してください。それ以外の場合は、使用可能な場合は短縮形または省略形が使用されます。したがって、egMMMMMまたはそれ以上は不要です。

SimpleDateFormat以下に、特定の文字列を解析して日付を取得するための有効なパターンの例をいくつか示します。

入力文字列 パターン
2001.07.04 西暦 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
2001年7月4日水曜日 EEE, MMM d, ''yy
午後12時8分 h:mm a
午後12時、太平洋夏時間 hh 'o''clock' a, zzzz
午後 0:08 (太平洋夏時間) K:mm a, z
02001.7.04 西暦 午後12時08分 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つまり、静的変数またはインスタンス変数として宣言して割り当て、別のメソッド/スレッドから再利用しないでください。常にメソッドのローカル スコープ内で新規に作成する必要があります。

おすすめ記事