java.time
これから紹介する 2 つのソリューションは、従来の日時 API (java.util
日時型とその書式設定 API SimpleDateFormat
) で動作しますが、この API は時代遅れでエラーが発生しやすいことに注意してください。使用を完全にやめてjava.time
、最新の日時 API *に切り替えることをお勧めします。以下に示す両方のソリューションは、java.time API を使用します。
RegEx とjava.time APIを使用したソリューション:
正規表現を使用して、\d{1,4}\/\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}
テキストから日時文字列を取得できます。リンクを調べて、RegEx とJava RegEx APIを理解することをお勧めします。次の点を参考にして、この特定の正規表現を理解できます。
\d{1,4}
:1~4桁
\/
: 文字リテラル、/
デモ:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String english = "Your Last Login was 2013/10/04 13:06:45 ( 0 Days, 0 Hours, 0 Minutes )";
String chinese = "您上次登录是 2013/10/04 13:06:45( 0 天, 0 小时 0 分钟 )";
// Assuming the date-time string is in the format, yyyy/MM/dd HH:mm:ss
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu/M/d H:m:s");
// Processing english
LocalDateTime dt = LocalDateTime.parse(getDateTime(english), dtf);
System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n", dt.getYear(),
dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());
// Processing chinese
dt = LocalDateTime.parse(getDateTime(chinese), dtf);
System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n", dt.getYear(),
dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());
}
static String getDateTime(String s) {
Matcher matcher = Pattern.compile("\\d{1,4}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}").matcher(s);
String strDateTime = "";
if (matcher.find()) {
strDateTime = matcher.group();
}
return strDateTime;
}
}
出力:
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
ONLINE DEMO
純粋にjava.time APIを使用したソリューション:
import java.text.ParsePosition;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
String english = "Your Last Login was 2013/10/04 13:06:45 ( 0 Days, 0 Hours, 0 Minutes )";
String chinese = "您上次登录是 2013/10/04 13:06:45( 0 天, 0 小时 0 分钟 )";
// Processing english
Optional<LocalDateTime> date = getDateTime(english);
date.ifPresent(dt -> System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n",
dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond()));
// Processing chinese
date = getDateTime(chinese);
date.ifPresent(dt -> System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n",
dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond()));
}
static Optional<LocalDateTime> getDateTime(String s) {
// Assuming the date-time string is in the format, yyyy/MM/dd HH:mm:ss
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu/M/d H:m:s");
Optional<LocalDateTime> result = Optional.empty();
for (int i = 0; i < s.length(); i++) {
try {
result = Optional.ofNullable(LocalDateTime.from(dtf.parse(s, new ParsePosition(i))));
break;
} catch (DateTimeParseException | IndexOutOfBoundsException e) {
}
}
return result;
}
}
出力:
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
ONLINE DEMO
Trail: Date Timeから最新の日時 API *について学んでください。
* 何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、ほとんどのjava.time機能を Java 6 および 7 にバックポートするThreeTen-Backportを使用できます。Androidプロジェクトと Android API で作業している場合レベルはまだ Java-8 に準拠していません。desugarで利用できる Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。