【问题标题】:Parsing Time difference解析时差
【发布时间】:2013-07-08 17:44:37
【问题描述】:

我在解析时差 [我从网页收到的] 时感到困惑。

例如:我得到一个这样的字符串:2 years 10 weeks 3 days 6 hours 7 min ago。请注意,yearweekdayhour 中的尾随 s 在统一的情况下可能不存在,并且不会出现在 min 中。

目前,我想获取这样存储的差异并获取实际日期和时间[通过从当前时间减去?]。

而且,我很困惑该怎么办?我知道时间解析方法,但它不是一个常规时间,另外还有那个尾随 s!!!

任何人都可以提出一个好的方法吗?

【问题讨论】:

  • 你能举一个你想要的例子吗?可能是代码尝试,您不确定是否继续?
  • split 空格上的字符串并取其他所有元素。
  • @Eluvatar 我明白这一点。但我完全糊涂了。不知道从哪里开始得到这样的差异。因为,我曾经解析时间而不是差异,所以这就是为什么......
  • @LeeMeador 那会是最好的选择吗?
  • 您确定事物之间总是有空格吗?如果是这样,您可以使用 String.split() 将所有不同的元素放入数组中的不同元素中,然后通过它们来确定哪些单元被命名;从您的示例中可以看出,在它们之前的位置总是有一个整数,因此“解析”很容易。您可以测试“周”和“周”。我不明白问题是什么......

标签: java android datetime


【解决方案1】:

我建议以毫秒为单位计算时间差,然后从现在减去,这很简单,但是你会遇到闰年的问题。

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);

这应该可以正常工作,但我还没有测试过。例如,您还必须处理几周都没有获得价值的情况。

【讨论】:

  • 其实计算不是问题。只是解析部分是我的问题。
【解决方案2】:

您可以使用此代码。这考虑了ss 和可能缺少一些令牌。

String orig = "2 years 10 weeks 3 days 6 hours 7 min ago";
String[] split = orig.replaceAll("[^0-9]+", " ").trim().split(" ");
Calendar cal = Calendar.getInstance();
int idx = 0;
if (orig.contains("yea")) cal.add(Calendar.YEAR, -Integer.parseInt(split[idx++]));
if (orig.contains("wee")) cal.add(Calendar.WEEK_OF_MONTH, -Integer.parseInt(split[idx++]));
if (orig.contains("day")) cal.add(Calendar.DATE, -Integer.parseInt(split[idx++]));
if (orig.contains("hour")) cal.add(Calendar.HOUR, -Integer.parseInt(split[idx++]));
if (orig.contains("min")) cal.add(Calendar.MINUTE, -Integer.parseInt(split[idx++]));

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
String formattedString = sdf.format(cal.getTime());
System.out.println(formattedString); // it prints 04-26-2011 02:12:54

【讨论】:

  • 那行不通。如果它是零周(周很可能会被省略)但是 2 年,在这种情况下,年将被放入周的位置。
  • 我会使用 week_of_year 而不是 _of_month
  • @njzk2 你能解释一下有什么不同吗? Afaik 唯一的区别是您何时获得该值,但当您设置该值时,它的行为与 week_of_mohtn 和 week_of_year 相同......
  • 我也不确定它是如何反映在添加中的。看起来您仍然有一些小问题,当天您正在添加 Calendar.DATE,而您正在再次添加 Calendar.HOUR。
  • DATE 是一天,这是正确的 afaik,我将最后一个小时修复为分钟,它没有看到它,谢谢
【解决方案3】:

使用@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?

【讨论】:

  • 没有要使用的month 关键字。我刚刚检查过了。不过,我可以根据自己的方便进行更改... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2021-05-10
  • 2015-04-09
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多