Go: Days in a month

To compute the last day of a month, you can use the fact that time.Date accepts values outside their usual ranges; the values are normalized during the conversion. For example, March 0 converts to the last day of February:

func main() {
	t := Date(2000, 3, 0) // the day before 2000-03-01
	fmt.Println(t)        // 2000-02-29 00:00:00 +0000 UTC
}

func Date(year, month, day int) time.Time {
	return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
}

AddDate normalizes its result in the same way. For example, adding one month to October 31 yields December 1, the normalized form of November 31:

t = Date(2000, 10, 31).AddDate(0, 1, 0) // a month after October 31
fmt.Println(t)                          // 2000-12-01 00:00:00 +0000 UTC

Comments