【问题标题】:Parsing date times in "X minutes/hours/days/weeks/months/years ago" format以“X 分钟/小时/天/周/月/年”格式解析日期时间
【发布时间】:2023-03-13 19:45:01
【问题描述】:

如何解析格式为 X 分钟/小时/天/周/月/年之前的日期。以下是一些示例来说明我所指的内容:

  • 3 天前
  • 1 分钟前
  • 2 年前

我认为使用默认的 Java 库并不容易。我说的对吗?

【问题讨论】:

  • 你打算解析“3天2小时前”吗?
  • 也许你正在寻找 PrettyTime:stackoverflow.com/questions/3859288/…
  • 嗨,Aioobe,不,我不是。只是我展示的简单格式。
  • @aioobe 为我的愚蠢道歉,我要去用漂白剂洗眼睛:P
  • Android 的 DateUtil 类可以处理这个问题,source code here。

标签: java


【解决方案1】:

一个基于Calendar API 的小sn-p。

Pattern p = Pattern.compile("(\\d+)\\s+(.*?)s? ago");

Map<String, Integer> fields = new HashMap<String, Integer>() {{
    put("second", Calendar.SECOND);
    put("minute", Calendar.MINUTE);
    put("hour",   Calendar.HOUR);
    put("day",    Calendar.DATE);
    put("week",   Calendar.WEEK_OF_YEAR);
    put("month",  Calendar.MONTH);
    put("year",   Calendar.YEAR);
}};

String[] tests = {
        "3 days ago",
        "1 minute ago",
        "2 years ago"
};

for (String test : tests) {

    Matcher m = p.matcher(test);

    if (m.matches()) {
        int amount = Integer.parseInt(m.group(1));
        String unit = m.group(2);

        Calendar cal = Calendar.getInstance();
        cal.add(fields.get(unit), -amount);
        System.out.printf("%s: %tF, %<tT%n", test, cal);
    }
}

输出:

3 days ago: 2012-08-18, 09:21:38
1 minute ago: 2012-08-21, 09:20:38
2 years ago: 2010-08-21, 09:21:38

【讨论】:

  • 谢谢艾奥贝。您的解决方案效果很好。点赞。顺便说一句,你知道有一个图书馆也可以做到这一点吗?
  • 我遇到了一个小问题。我建议用\\s 替换空格。
【解决方案2】:

它实际上取决于您所指的“以前”的上下文,是从当前日期开始,还是从指定日期开始。

您可以使用 Java API 来实现它:

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2011-05-23
    • 2012-08-29
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多