* `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` | ✅ |
| 精度為「秒」,不含毫秒 | ✅ |
---