簡體   English   中英

用於解析人類可讀算術計算的日期庫

[英]Date library for parsing human readable arithmetic calculations

我正在編寫一個 QA 測試自動化程序,其中人們將使用算術運算輸入人類可讀的持續時間字符串,其值如now - 5dyesterdaynow + 8 days ,我需要將它們解析為 java 8 LocalDateTime實例。

簡單地說,我需要一個這樣的實用程序:

LocalDateTime nowMinus5Days = DurationUtil.parseHumanReadableDuration("now - 5d")

我如何在 Java 中編寫此代碼? 或者是否有一些已經存在的庫我應該使用而不是試圖重新發明輪子?

這是一個起點。 我猜你會想進一步闡述它。

private static Pattern relativeTimePattern
        = Pattern.compile("(\\w+)\\s*(?:([+-])\\s*(\\w+))?");
private static Map<String, Supplier<LocalDateTime>> bases
        = Map.of("now", () -> LocalDateTime.now(),
                "yesterday", () -> LocalDate.now().minusDays(1).atStartOfDay()); 

public static LocalDateTime parseRelativeTime(String timeString) {
    Matcher m = relativeTimePattern.matcher(timeString);
    if (m.matches()) {
        String baseString = m.group(1);
        LocalDateTime result = bases.get(baseString).get();
        String signString = m.group(2);
        if (signString != null) {
            boolean subtract = signString.equals("-");
            String diffString = m.group(3);
            TemporalAmount diff;
            try {
                diff = Period.parse("P" + diffString);
            } catch (DateTimeParseException dtpe) {
                // try a Duration instead
                diff = Duration.parse("PT" + diffString);
            }
            if (subtract) {
                result = result.minus(diff);
            } else {
                result = result.plus(diff);
            }
        }
        return result;
    } else {
        throw new IllegalArgumentException();
    }
}

讓我們試試看:

    System.out.println(parseRelativeTime("now - 5d"));
    System.out.println(parseRelativeTime("yesterday"));
    System.out.println(parseRelativeTime("now + 8d"));

剛才跑的時候輸出:

 2020-03-30T09:49:18.300731 2020-04-03T00:00 2020-04-12T09:49:18.307784

由於我的方法表示,它接受的要么nowyesterday小寫后面可以跟一個符號( +-的年,月,周,日和句點小時-分-秒的持續時間。 后面的每一個都必須使用一個字母縮寫作為時間單位(y, m, w, d, h, m, s;當有歧義的 m 單獨出現時,以月為單位)。 期間或持續時間內不允許有空格。

可以想到的進一步發展包括:

  • 添加更多詞: todaytomorrow 考慮允許大寫和混合大小寫。
  • 允許單位完整且有空間,例如8 days 進一步的正則表達式將在最終解析為Period之前將其轉換為8d
  • 禁止模棱兩可的2m強制用戶指定例如2m0d (2 個月 0 天)或2m0s (2 分 0 秒)。 或者強制大寫M幾個月,小寫m分鍾。
  • 復雜的部分:為無法解析的字符串提供有用的錯誤消息。

我認為幾乎不可能(或至少很難)將每個可能的 String 輸入轉換為有效日期。 它甚至可能需要一些智能的自然語言處理。

我建議使用一組公開用於輸入的字段並將它們轉換為所需的對象。 如果有最終用戶,您可以讓用戶選擇他們是要添加還是減去日期,然后顯示一個文本輸入,他們可以在其中輸入天數。 您可以將“昨天”和“明天”等輸入作為特殊輸入處理。

Java的日期套餐是非常有用的,有方法的加和減天的給定數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM