1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package feed
- import "time"
- // TODO: very inflexible, refactor to allow more customizability
- // TODO: allow changing first day of week
- // TODO: allow changing between showing the previous and next week and the entire month
- func NewCalendar(now time.Time) *Calendar {
- year, week := now.ISOWeek()
- weekday := now.Weekday()
- if weekday == 0 {
- weekday = 7
- }
- currentMonthDays := daysInMonth(now.Month(), year)
- var previousMonthDays int
- if previousMonthNumber := now.Month() - 1; previousMonthNumber < 1 {
- previousMonthDays = daysInMonth(12, year-1)
- } else {
- previousMonthDays = daysInMonth(previousMonthNumber, year)
- }
- startDaysFrom := now.Day() - int(weekday+6)
- days := make([]int, 21)
- for i := 0; i < 21; i++ {
- day := startDaysFrom + i
- if day < 1 {
- day = previousMonthDays + day
- } else if day > currentMonthDays {
- day = day - currentMonthDays
- }
- days[i] = day
- }
- return &Calendar{
- CurrentDay: now.Day(),
- CurrentWeekNumber: week,
- CurrentMonthName: now.Month().String(),
- CurrentYear: year,
- Days: days,
- }
- }
- func daysInMonth(m time.Month, year int) int {
- return time.Date(year, m+1, 0, 0, 0, 0, 0, time.UTC).Day()
- }
|