[解決済み] Java文字列→日付変換
質問
を変換する最も良い方法は何ですか?
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月は全文が表示される月なので
MMMM
パターン -
2"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; 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
パターンを使って、与えられた文字列を解析し、日付を表示します。
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
は
ではなく
スレッドセーフです。言い換えれば、静的変数やインスタンス変数として宣言して代入し、それを別のメソッドやスレッドから再利用してはいけないのです。常にメソッドのローカルスコープで新規に作成する必要があります。
関連
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
サーブレットクラスのインスタンス化エラーの解決法
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
Dateが型に解決できない問題を解決する
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
テストが見つかりませんでした
-
ローカルリソースのロードが許可されていない場合の解決策
-
[解決済み] 日付の解析方法は?[重複している]。
-
[解決済み] javaの文字列をDateオブジェクトに変換する方法 [重複]。