calendar.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package feed
  2. import "time"
  3. // TODO: very inflexible, refactor to allow more customizability
  4. // TODO: allow changing first day of week
  5. // TODO: allow changing between showing the previous and next week and the entire month
  6. func NewCalendar(now time.Time) *Calendar {
  7. year, week := now.ISOWeek()
  8. weekday := now.Weekday()
  9. if weekday == 0 {
  10. weekday = 7
  11. }
  12. currentMonthDays := daysInMonth(now.Month(), year)
  13. var previousMonthDays int
  14. if previousMonthNumber := now.Month() - 1; previousMonthNumber < 1 {
  15. previousMonthDays = daysInMonth(12, year-1)
  16. } else {
  17. previousMonthDays = daysInMonth(previousMonthNumber, year)
  18. }
  19. startDaysFrom := now.Day() - int(weekday+6)
  20. days := make([]int, 21)
  21. for i := 0; i < 21; i++ {
  22. day := startDaysFrom + i
  23. if day < 1 {
  24. day = previousMonthDays + day
  25. } else if day > currentMonthDays {
  26. day = day - currentMonthDays
  27. }
  28. days[i] = day
  29. }
  30. return &Calendar{
  31. CurrentDay: now.Day(),
  32. CurrentWeekNumber: week,
  33. CurrentMonthName: now.Month().String(),
  34. CurrentYear: year,
  35. Days: days,
  36. }
  37. }
  38. func daysInMonth(m time.Month, year int) int {
  39. return time.Date(year, m+1, 0, 0, 0, 0, 0, time.UTC).Day()
  40. }