簡體   English   中英

在 Java 中將人類可讀的時間解析為毫秒

[英]Parse humanreadble time to milliseconds in Java

我正在嘗試將 4hours 或 1day 或 2months 之類的字符串轉換為毫秒。 但是我將如何有效地做到這一點而不必檢查 string.contains("h") 等......?

Node 有ms ,Java 會不會有類似的東西?

根據一些回復進行編輯:是的,實際數字可能會改變,我以 4 小時為例,但可以是 1、2、3、5 等。日期和月份相同。 是的,它們直接相鄰。 沒空間了。 示例字符串:remote 1h Go to school 輸出應為:3 600 000(毫秒)

好吧,你可以把它分解成更小的部分。

  • 在字符串中查找此類事件;
  • 取數字部分和單位部分並將它們的值相乘以獲得毫秒。

要查找出現次數,您可以使用正則表達式。 (-?\\d+)(h|days|min|sec)這樣的正則表達式會匹配這樣的字符串。 使用PatternMatcher會有所幫助。

要將數字轉換為毫秒,單位需要映射到與該單位的毫秒數匹配的值。 例如, days將映射到 86400000。

雖然它不是內置的,但我覺得它並沒有那么糟糕。

    String[] exampleStrings = { "4hours", "1day", "2months" };
    for (String example : exampleStrings) {
        long millis;
        if (example.contains("hour") || example.contains("minute")
                || example.contains("second")) {
            String durationString = "PT" + unitToAbbreviation(example);
            Duration dur = Duration.parse(durationString);
            millis = dur.toMillis();
        } else {
            String periodString = "P" + unitToAbbreviation(example);
            Period per = Period.parse(periodString);
            Duration estimatedDuration = Duration.ZERO;
            for (TemporalUnit unit : per.getUnits()) {
                estimatedDuration = estimatedDuration.plus(
                        unit.getDuration().multipliedBy(per.get(unit)));
            }
            millis = estimatedDuration.toMillis();
        }
        System.out.format("%7s -> %10d milliseconds%n", example, millis);
    }

此示例的輸出為:

 4hours -> 14400000 milliseconds 1day -> 86400000 milliseconds 2months -> 5259492000 milliseconds

我假設您在字符串中只有一個數字和一個單位。 這可能是2months1day但不2months1day

天、月和年的長度是不准確的估計,因為它們的實際長度各不相同。 一個月可以是 28 到 31 天,一天可以是 23 到 25 小時。

我使用用於將下面的小的輔助方法4hours成只是4h所要求的Duration.parse()

String unitToAbbreviation(String withFullUnit) {
    return withFullUnit.replaceFirst("(\\d+[a-z])[a-z]*", "$1");
}

如果是Period (基於天而不是基於時間的間隔),我將迭代Period支持的單位——年、月和日。 對於每個我使用TemporalUnit.getDuration()來獲得它的估計持續時間和Period.get()來獲得相應的值。 mulitpliedBy()的調用(不要感到驚訝)將兩者相乘。

暫無
暫無

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

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