在業務開發中,常需將持續秒數轉換為「X年Y月Z日...」這類人類可讀格式。本文提供一個輕量級工具方法,支援從秒到年級的完整轉換,適合任務倒計時、運行時長顯示等場景。
採用逐級取模除法:從秒開始,依次計算秒、分、時、天、月、年。為簡化計算,假設每月 30 天、每年 12 個月(非精確曆法,但滿足相對時長展示需求)。
/**
* 將秒數轉換為中文時長字符串
* @param totalSeconds 總秒數(>0 表示未來,<=0 返回「立刻」)
* @return 格式如「1年又2個月3天4小時5分6秒」
*/
public static String formatDurationChinese(long totalSeconds) {
if (totalSeconds <= 0) {
return "立刻";
}
long t = totalSeconds;
long seconds = t % 60; t /= 60;
long minutes = t % 60; t /= 60;
long hours = t % 24; t /= 24;
long days = t % 30; t /= 30;
long months = t % 12; t /= 12;
long years = t;
StringBuilder sb = new StringBuilder();
if (years > 0) sb.append(years).append("年又");
if (months > 0) sb.append(months).append("個月");
if (days > 0) sb.append(days).append("天");
if (hours > 0) sb.append(hours).append("小時");
if (minutes > 0) sb.append(minutes).append("分");
if (seconds > 0) sb.append(seconds).append("秒");
return sb.toString();
}
System.out.println(formatDurationChinese(0)); // 立刻
System.out.println(formatDurationChinese(45)); // 45秒
System.out.println(formatDurationChinese(3661)); // 1小時1分1秒
System.out.println(formatDurationChinese(90061)); // 1天1小時1分1秒
System.out.println(formatDurationChinese(3600L*24*30*12 + 3600)); // 1年又1小時
java.time.Period 或 ChronoUnit。import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Period;
public static String formatDurationExact(long seconds) {
if (seconds <= 0) return "立刻";
LocalDateTime start = LocalDateTime.now();
LocalDateTime end = start.plusSeconds(seconds);
Period period = Period.between(start.toLocalDate(), end.toLocalDate());
Duration duration = Duration.between(start.toLocalTime(), end.toLocalTime());
// 組合 period 與 duration 輸出...
}
精確版利用 java.time 計算真實年月日差,適合對精度要求高的場景。