我在解析时差[我从网页上收到]时感到困惑。
例如:我得到一个这样的字符串:2 years 10 weeks 3 days 6 hours 7 min ago
。请注意s
,year
,week
和day
中的结尾hour
可能不存在,如果统一且不存在{{1} }}
目前,我希望得到这样的差异并获得实际的日期和时间[通过从当前时间减去?]。
而且,我很困惑该怎么办?我知道时间解析方法,但它不是一个常规时间,而且还有那个尾随min
!!!
有人能建议一个好方法吗?
答案 0 :(得分:0)
我建议计算差异以毫秒为单位的时间,然后从现在开始减去,这很简单但是你会遇到闰年的问题。
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -2);
cal.add(Calendar.WEEK_OF_YEAR, -10);
cal.add(Calendar.DAY_OF_YEAR, -3);
cal.add(Calendar.HOUR_OF_DAY, -6);
cal.add(Calendar.MINUTE, -7);
应该可以正常工作,但我还没有测试过。例如,你还必须处理几周没有获得价值的情况。
答案 1 :(得分:0)
您可以使用此代码。这考虑了{{1'并且可能缺少一些令牌。
s
答案 2 :(得分:0)
使用@ Eluvatar的建议,在每个部分之间留出空格:
Calendar cal = Calendar.getInstance();
String original = "2 years 10 weeks 3 days 6 hours 7 min ago";
// Split on whitespace separators ("\s+" means "one or more whitespace characters"),
// having trimmed whitespace at beginning and end.
String[] split = original.trim().split("\s+");
// Now parse each entry
int num = split.length;
int pos = 0;
while ((num-pos) >= 2) {
if (split[pos].regionMatches(true, 0, "year", 0, 4)) {
cal.add(Calendar.YEAR, -Integer.decode(split[++pos]));
}
else if (split[pos].regionMatches(true, 0, "month", 0, 5)) {
cal.add(Calendar.MONTH, -Integer.decode(split[++pos]));
}
else if (split[pos].regionMatches(true, 0, "week", 0, 4)) {
cal.add(Calendar.WEEK_OF_YEAR, -Integer.decode(split[++pos]));
}
// And so on through the other potential values, note that the last
// number in regionMatches is the number of characters to match.
pos++;
}
“\ s +”可能需要变为“\ s +”,请参阅How do I split a string with any whitespace chars as delimiters?。