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月」は完全なテキストの月なので、
MMMM
パターンを使用します - 「2」は月の短縮日なので、
d
そのパターンを使用します。 - 「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
。つまり、静的変数またはインスタンス変数として宣言して割り当て、別のメソッド/スレッドから再利用しないでください。常にメソッドのローカル スコープ内で新規に作成する必要があります。