[英]Date library for parsing human readable arithmetic calculations
我正在編寫一個 QA 測試自動化程序,其中人們將使用算術運算輸入人類可讀的持續時間字符串,其值如now - 5d
、 yesterday
、 now + 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
由於我的方法表示,它接受的要么now
和yesterday
小寫后面可以跟一個符號( +
或-
的年,月,周,日和句點或小時-分-秒的持續時間。 后面的每一個都必須使用一個字母縮寫作為時間單位(y, m, w, d, h, m, s;當有歧義的 m 單獨出現時,以月為單位)。 期間或持續時間內不允許有空格。
可以想到的進一步發展包括:
today
, tomorrow
; 考慮允許大寫和混合大小寫。8 days
。 進一步的正則表達式將在最終解析為Period
之前將其轉換為8d
。2m
強制用戶指定例如2m0d
(2 個月 0 天)或2m0s
(2 分 0 秒)。 或者強制大寫M
幾個月,小寫m
分鍾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.