markdown-it
demo
Delete
Submit
clear
permalink
* `getDatePeriodString(long startMillis, long endMillis)` → 回傳 `-P1Y2M3D` * `getTimeDurationString(long startMillis, long endMillis)` → 回傳 `PT4H5M6S` > 💡 兩者都會根據毫秒時間戳輸入,自動處理正負順序,只計算到秒,並保留 `-` 號表示反向差距。 --- ### ✅ 完整 Java 程式碼 ```java import java.time.*; public class Iso8601DateTimeDiff { // 回傳年月日部分,例如 P1Y2M3D 或 -P1Y2M3D public static String getDatePeriodString(long startMillis, long endMillis) { boolean isNegative = endMillis < startMillis; Instant startInstant = Instant.ofEpochMilli(Math.min(startMillis, endMillis)); Instant endInstant = Instant.ofEpochMilli(Math.max(startMillis, endMillis)); ZonedDateTime start = startInstant.atZone(ZoneOffset.UTC); ZonedDateTime end = endInstant.atZone(ZoneOffset.UTC); Period period = Period.between(start.toLocalDate(), end.toLocalDate()); StringBuilder sb = new StringBuilder(); if (isNegative) sb.append("-"); sb.append(period.toString().replaceAll("-", "")); return sb.toString(); } // 回傳時間部分,例如 PT4H5M6S 或 -PT4H5M6S(不含毫秒) public static String getTimeDurationString(long startMillis, long endMillis) { boolean isNegative = endMillis < startMillis; Instant startInstant = Instant.ofEpochMilli(Math.min(startMillis, endMillis)); Instant endInstant = Instant.ofEpochMilli(Math.max(startMillis, endMillis)); ZonedDateTime start = startInstant.atZone(ZoneOffset.UTC); ZonedDateTime end = endInstant.atZone(ZoneOffset.UTC); Period period = Period.between(start.toLocalDate(), end.toLocalDate()); ZonedDateTime dateAlignedStart = start.plus(period); Duration duration = Duration.between(dateAlignedStart, end); StringBuilder sb = new StringBuilder(); if (isNegative) sb.append("-"); sb.append(duration.toString().replaceAll("-", "")); return sb.toString(); } // 測試 public static void main(String[] args) { long start = Instant.parse("2022-01-01T08:00:00.000Z").toEpochMilli(); long end = Instant.parse("2023-03-04T12:05:06.000Z").toEpochMilli(); System.out.println(getDatePeriodString(start, end)); // P1Y2M3D System.out.println(getTimeDurationString(start, end)); // PT4H5M6S // 測試反向差距 System.out.println(getDatePeriodString(end, start)); // -P1Y2M3D System.out.println(getTimeDurationString(end, start)); // -PT4H5M6S } } ``` --- ### ✅ 特點 | 功能 | 支援 | | -------------------------- | -- | | 接收毫秒 timestamp (`long`) | ✅ | | 支援正向與反向輸出(加 `-`) | ✅ | | 獨立輸出 `Period` / `Duration` | ✅ | | 精度為「秒」,不含毫秒 | ✅ | ---
html
source
debug
Fork me on GitHub