を(Oct
)携帯電話のデフォルトロケールが英語ではないので、それはおそらく発生し、あなたの入力の月名です。 (この古いAPIがlots of problemsとdesign issuesを持っているとして)、あなたはThreeTen Backport、大きなバックポートを使用することができ、直接SimpleDateFormat
での作業の代わりに
SimpleDateFormat dtfmt = new SimpleDateFormat("dd MMM yyyy hh:mm a", Locale.ENGLISH);
Date dt = dtfmt.parse("24 Oct 2016 7:31 pm");
:
ソリューションは、明示的に英語ロケールを使用することですJava 8の新しい日付/時刻クラス。 Androidで使用するには、ThreeTenABP(詳しくはhereの使用方法)が必要です。
主なクラスはorg.threeten.bp.LocalDateTime
(入力に日付と時刻のフィールドがあるので最適です)とorg.threeten.bp.format.DateTimeFormatter
(入力を解析する)です。私もそれが英語の月名を解析することを確認するjava.util.Locale
クラスを使用して、org.threeten.bp.format.DateTimeFormatterBuilder
(デフォルトはPM
あるとして、それは大文字小文字を区別します)、それはpm
を解析することを確認する:
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// case insensitive to parse "pm"
.parseCaseInsensitive()
// pattern
.appendPattern("dd MMM yyyy h:mm a")
// use English locale to parse month name (Oct)
.toFormatter(Locale.ENGLISH);
// parse input
LocalDateTime dt = LocalDateTime.parse("24 Oct 2016 7:31 pm", fmt);
System.out.println(dt); // 2016-10-24T19:31
出力は次のようになります。
2016-10-24T19:31
あなたはjava.util.Date
にこれを変換する必要がある場合は、org.threeten.bp.DateTimeUtils
クラスを使用することができます。しかし、これを変換するために使用するタイムゾーンを知る必要もあります。以下の例では、私は「UTC」を使用しています:
Date date = DateTimeUtils.toDate(dt.atZone(ZoneOffset.UTC).toInstant());
を別のゾーンに変更するには、行うことができます:
Date date = DateTimeUtils.toDate(dt.atZone(ZoneId.of("Europe/London")).toInstant());
注意をAPIがフォーマットContinent/City
で常に(IANA timezones namesを使用していること例えば、America/Sao_Paulo
またはEurope/Berlin
)。 ambiguous and not standardであるため、3文字の略語(CST
またはなど)は使用しないでください。各地域に適したタイムゾーンを見つけるには、ZoneId.getAvailableZoneIds()
メソッドを使用して、ユースケースに最適なタイムゾーンを確認してください。
PS:上記の最後の例(dt.atZone(ZoneId.of("Europe/London"))
)は、ロンドン時間帯の日付/時刻2016-10-24T19:31
を作成します。しかし、あなたが望むものがUTCで2016-10-24T19:31
であれば、別のタイムゾーンに変換してください。
Date date = DateTimeUtils.toDate(dt
// first convert it to UTC
.toInstant(ZoneOffset.UTC)
// then convert to LondonTimezone
.atZone(ZoneId.of("Europe/London")).toInstant());