gte/internal/task/date.go

127 lines
2.1 KiB
Go
Raw Normal View History

2021-01-29 17:22:07 +01:00
package task
2021-01-30 11:20:12 +01:00
import (
2021-01-30 15:25:25 +01:00
"strings"
2021-01-30 11:20:12 +01:00
"time"
)
2021-01-29 17:22:07 +01:00
2021-01-30 15:25:25 +01:00
const (
DateFormat = "2006-01-02 (Monday)"
)
var Today Date
func init() {
year, month, day := time.Now().Date()
Today = NewDate(year, int(month), day)
}
2021-01-30 11:20:12 +01:00
type Date struct {
t time.Time
}
2021-01-30 15:25:25 +01:00
func NewDate(year, month, day int) Date {
if year == 0 && month == 0 && day == 0 {
return Date{}
}
2021-01-30 11:20:12 +01:00
var m time.Month
switch month {
case 1:
m = time.January
case 2:
m = time.February
case 3:
m = time.March
case 4:
m = time.April
case 5:
m = time.May
case 6:
m = time.June
case 7:
m = time.July
case 8:
m = time.August
case 9:
m = time.September
case 10:
m = time.October
case 11:
m = time.November
case 12:
m = time.December
}
2021-01-30 15:25:25 +01:00
t := time.Date(year, m, day, 0, 0, 0, 0, time.UTC)
2021-01-30 11:20:12 +01:00
2021-01-30 15:25:25 +01:00
return Date{
t: t,
2021-01-30 11:20:12 +01:00
}
2021-01-30 15:25:25 +01:00
}
2021-01-30 11:20:12 +01:00
2021-01-30 15:25:25 +01:00
func NewDateFromString(date string) Date {
date = strings.ToLower(strings.TrimSpace(date))
if date == "no date" || date == "" {
return Date{}
2021-01-30 11:20:12 +01:00
}
2021-01-30 15:25:25 +01:00
t, err := time.Parse(DateFormat, date)
if err == nil {
return Date{t: t}
}
t, err = time.Parse("2006-01-02", date)
if err == nil {
return Date{t: t}
}
weekday := Today.Weekday()
var newWeekday time.Weekday
switch {
case date == "monday" || date == "maandag":
newWeekday = time.Monday
case date == "tuesday" || date == "dinsdag":
newWeekday = time.Tuesday
case date == "wednesday" || date == "woensdag":
newWeekday = time.Wednesday
case date == "thursday" || date == "donderdag":
newWeekday = time.Thursday
case date == "friday" || date == "vrijdag":
newWeekday = time.Friday
case date == "saturday" || date == "zaterdag":
newWeekday = time.Saturday
case date == "sunday" || date == "zondag":
newWeekday = time.Sunday
}
daysToAdd := int(newWeekday) - weekday
if daysToAdd < 0 {
daysToAdd += 7
}
return Today.Add(daysToAdd)
2021-01-30 11:20:12 +01:00
}
func (d *Date) String() string {
if d.t.IsZero() {
return "no date"
}
2021-01-29 17:22:07 +01:00
2021-01-30 15:25:25 +01:00
return strings.ToLower(d.t.Format(DateFormat))
}
func (d *Date) IsZero() bool {
return d.t.IsZero()
}
func (d *Date) Weekday() int {
return int(d.t.Weekday())
}
func (d *Date) Add(days int) Date {
year, month, day := d.t.Date()
return NewDate(year, int(month), day+days)
2021-01-29 17:22:07 +01:00
}