我的申请给了我一个字符串,如1天15分钟或15小时10分钟等。 我想将此字符串转换为Date对象。 我正在尝试这样的事情
Date afterAddingTenMins = new Date(t + (Integer.valueOf(duration) * ONE_MINUTE_IN_MILLIS));
但是这给了我无效的整数异常,因为字符串包含像小时和分钟这样的单词 什么是最好的方法。
谢谢。
答案 0 :(得分:1)
这是一个scala版本:
object PrettyTimeParser {
private val YEAR_REGEX = """(?<YEAR>\d+)\s*years?""".r
private val MONTH_REGEX = """(?<MONTH>\d+)\s*months?""".r
private val WEEK_REGEX = """(?<WEEK>\d+)\s*weeks?""".r
private val DAY_REGEX = """(?<DAY>\d+)\s*days?""".r
private val HOUR_REGEX = """(?<HOUR>\d+)\s*hours?""".r
private val MINUTE_REGEX = """(?<MINUTE>\d+)\s*minutes?""".r
private def lookup(regex: scala.util.matching.Regex, s: String): Int = {
Try(regex.findAllIn(s).toList.headOption.map(_.split(" ")).map(_(0).toInt)).getOrElse(None).getOrElse(0)
}
def parse(str: String): Option[DateTime] = {
val year = lookup(YEAR_REGEX, str)
val month = lookup(MONTH_REGEX, str)
val week = lookup(WEEK_REGEX, str)
val day = lookup(DAY_REGEX, str)
val hour = lookup(HOUR_REGEX, str)
val minute = lookup(MINUTE_REGEX, str)
val now = DateTime.now()
val dt = DateTime.now().plusYears(year)
.plusMonths(month)
.plusWeeks(week)
.plusDays(day)
.plusHours(hour)
.plusMinutes(minute)
if (dt.isAfter(now.getMillis)) Option(dt) else None
}
}
答案 1 :(得分:0)
您可以通过正则表达式提取它们:
String time = "1 day 15 min";
Pattern pat = Pattern.compile("(?<DAY>\\d+)\\s*days?|(?<HOUR>\\d+)\\s*hours?|(?<MIN>\\d+)\\s*min");
Matcher m = pat.matcher(time);
int day = 0, hour = 0, min = 0;
while (m.find()) {
if (m.group("DAY") != null) day = Integer.parseInt(m.group("DAY"));
if (m.group("HOUR") != null) hour = Integer.parseInt(m.group("HOUR"));
if (m.group("MIN") != null) min = Integer.parseInt(m.group("MIN"));
}
System.out.printf("%d day %d hour %d min%n", day, hour, min);
// -> 1 day 0 hour 15 min
答案 2 :(得分:0)
理想的解决方案是更改数据源以提供JSON或其他可靠格式:
{
days: 15,
hours: 9,
minutes: 30
}
然后您可以使用JSON库来解析数据。
但是如果你处理那个字符串,你可以像saka1029那样去正则路由,甚至更简单,只需手动解析字符串:
String test = "15 hour 10 min";
String[] testArray = test.split(" ");
long additionalDuration = 0;
for(int i = 0; i < testArray.length; i+=2) {
switch(testArray[i+1].toLowerCase()) {
case "day":
case "days":
additionalDuration += Integer.parseInt(testArray[i]) * (1000 * 60 * 60 * 24);
break;
case "hour":
case "hours":
additionalDuration += Integer.parseInt(testArray[i]) * (1000 * 60 * 60);
break;
case "minute":
case "minutes":
additionalDuration += Integer.parseInt(testArray[i]) * (1000*60);
break;
default:
System.out.println("Could not parse unit: \""+testArray[i+1]+"\"");
}
}
Date futureDate = new Date(new Date().getTime() + additionalDuration);