package main
import (
"fmt"
"time"
)
type YMD struct {
Years int
Months int
Days int
}
func SplitDays(totalDays int) YMD {
start := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC)
end := start.AddDate(0, 0, totalDays)
years := end.Year() - start.Year()
months := int(end.Month()) - int(start.Month())
days := end.Day() - start.Day()
// Normalize negative days
if days < 0 {
months--
prevMonth := end.AddDate(0, -1, 0)
days += daysInMonth(prevMonth.Year(), prevMonth.Month())
}
// Normalize negative months
if months < 0 {
months += 12
years--
}
return YMD{years, months, days}
}
func daysInMonth(year int, month time.Month) int {
// Day 0 of next month = last day of this month
t := time.Date(year, month+1, 0, 0, 0, 0, 0, time.UTC)
return t.Day()
}
func main() {
r := SplitDays(452)
fmt.Printf("%d years, %d months, %d days\n", r.Years, r.Months, r.Days)
}
/*
run:
1 years, 2 months, 28 days
*/