我有输入时间字符串,表示各种格式的时间,如"1PM"
(格式为:hha),"1300"
(格式为:kkmm),我想将其转换为单一格式,说"1300"
(kkmm)。
我怎么知道输入时间字符串的格式是什么(hha或kkmm等)?
我知道如何将其转换为所需的格式,但我很难知道输入字符串的格式。
String inputTime = '1PM';
SimpleDateFormat inputFormat = new SimpleDateFormat('hha');
SimpleDateFormat outputFormat = new SimpleDateFormat('kkmm');
Date date = inputFormat.parse(inputTime);
String output = outputFormat.format(date);
OUTPUT是:1300。
在这里,我将输入格式作为' hha'在第一行代码中。我想避免这种情况,并从inputTime字符串中提取时间格式。
答案 0 :(得分:1)
你有什么特别的理由使用麻烦且久已过时的SimpleDateFormat
课程吗?你最好的第一步就是抛弃它。而是使用现代Java日期和时间API LocalTime
中的DateTimeFormatter
和java.time
。该API可以更好地使用。
基本上有两种方法可以解决您的问题。我将使用java.time
依次呈现它们。
进行简单测试以确定使用哪种格式;例如,如果字符串以M
结尾,请使用ha
,否则使用Hmm
。
private static DateTimeFormatter formatterWithAmPm
= DateTimeFormatter.ofPattern("ha", Locale.ENGLISH);
private static DateTimeFormatter formatterWithMinutes
= DateTimeFormatter.ofPattern("Hmm");
public static LocalTime parseTime(String inputTime) {
if (inputTime.endsWith("M")) {
return LocalTime.parse(inputTime, formatterWithAmPm);
} else {
return LocalTime.parse(inputTime, formatterWithMinutes);
}
}
我很惊讶地看到格式模式字符串Hmm
将123
解析为01:23而1234
解析为12:34,但它非常方便。
我认为这个选项最适合几种不变的格式。稍后用其他格式进行扩展并不容易。
依次尝试每种可能的格式,捕获任何异常并查看哪一个没有抛出任何异常。
private static final DateTimeFormatter[] parseFormatters
= Arrays.asList("ha", "Hmm") // add more format pattern strings as required
.stream()
.map(fps -> DateTimeFormatter.ofPattern(fps, Locale.ENGLISH))
.toArray(DateTimeFormatter[]::new);
public static LocalTime parseTime(String inputTime) {
DateTimeParseException aCaughtException = null;
for (DateTimeFormatter formatter : parseFormatters) {
try {
return LocalTime.parse(inputTime, formatter);
} catch (DateTimeParseException dtpe) {
aCaughtException = dtpe;
// otherwise ignore, try next formatter
}
}
throw aCaughtException;
}
请注意检查您是否有两种格式可能匹配相同的输入并产生不同的结果。这也意味着您无法以这种方式区分所有可思考的格式。想象1300
表示当天1300分钟即21:40的格式并不是太不合理。它甚至可能意味着当天的第二天1300,00:21:40。