答案:都不是。主流平台(如 Stripe、Netflix、Google Play)的「每月」通常是按曆月計算:從你訂閱的那一天起,每個月在同一日續扣;若該月沒有那一天,就在當月最後一天扣款。
為什麼不是 30 或 31 天?
因為「每月」本來就不是固定天數:二月只有 28 或 29 天,其他月份 30 或 31 天。為了對齊現實世界的月度週期(薪資、財務帳單、會計與報表),多數服務採用曆月邏輯,而非硬性 30 天。
曆月是怎麼算的?
- 一般規則:從「起始日」算到「下個月同日」。
- 例:1/15 開始 → 下一期 2/15、再下一期 3/15。
- 沒有同日怎麼辦 → 取當月最後一天。
- 例:1/31 開始 → 2/28 → 3/31 → 4/30 → 5/31 ……
備註:扣款日可能因時區差異看起來早/晚一天。

DateTime nextBillingDate(DateTime start) {
int year = start.year;
int month = start.month + 1;
if (month > 12) { month = 1; year++; }
try {
return DateTime(year, month, start.day);
} catch (e) {
// 如果該月沒有這一天 → 取當月最後一天
return DateTime(year, month + 1, 0);
}
}