首页 > 解决方案 > Java 8 日期表达式

问题描述

JSR 310 为 Java 8 带来了一个不错的日期时间 API。我想知道是否有某种表达式语言可以创建,例如java.time.LocalDate使用

now + 2y

这将类似于

LocalDate.now().plusYears(2)

Java中有这样的功能吗?

这个问题可能有点宽泛,但让我进一步解释一下。我正在寻找某种可以应用于例如 a 的表达式LocalDate。原来有Duration& Period

这意味着我可以根据标准化的 ISO-8601 格式(例如P2Y.

如果我然后做类似的事情

LocalDate.now().plus(Period.parse("P2Y"));

有了这个,我得到了我正在寻找的非常基本的行为。

标签: java

解决方案


(回答是因为评论太小且未格式化)

虽然我不知道这样的 API,但可能存在,但您必须将某种类似语言的对象(例如 String-literals)传递到方法中以定义您想要的内容。

它可能看起来像这样:

DateTimeUtil.offset("+2y");

这样的 API 可以做的更多:

Calendar oldCalendarObject = ...;
DateTimeUtil.shift("+2y+6M-6d");

可以通过正则表达式解析来完成,所以它甚至没有那么复杂。

public class DateTimeUtil {
    private static final Pattern SHIFT_PATTERN = Pattern.compile("\\s*([+-])(\\d+)([yMdmsn])\\s*");

    public static void shift(Calendar cal, String shift) {
        Matcher matcher = SHIFT_PATTERN.matcher(shift);
        while (matcher.find()) {
            boolean positive = matcher.group(1).equals("+");
            int num= Integer.valueOf(matcher.group(2));
            String unit = matcher.group(3);
            // do modification here.
        }
    }
}

推荐阅读