/
date.go
130 lines (114 loc) · 2.57 KB
/
date.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package utils
import (
"fmt"
"regexp"
"strings"
"time"
)
var dateRe1 = regexp.MustCompile(`^\s*(\d+)\.(\d+)\.(\d\d\d\d)\s*$`)
var dateRe2 = regexp.MustCompile(`^\s*(\d\d\d\d)-(\d+)-(\d+)\s*$`)
func DateYMS(s string) string {
m := dateRe1.FindStringSubmatch(s)
if m != nil {
return fmt.Sprintf("%s-%s-%s", m[3], m[2], m[1])
}
m = dateRe2.FindStringSubmatch(s)
if m != nil {
return fmt.Sprintf("%s-%s-%s", m[1], m[2], m[3])
}
return ""
}
func ParseDate(s string) (time.Time, error) {
loc, _ := time.LoadLocation("Europe/Berlin")
d, err := time.ParseInLocation("2006-01-02", s, loc)
if err == nil {
return d, nil
}
return time.ParseInLocation("02.01.2006", s, loc)
}
type TimeRange struct {
From time.Time
To time.Time
}
var dateRe = regexp.MustCompile(`\b(\d\d\.\d\d\.\d\d\d\d)\b`)
func ParseTimeRange(s string) (TimeRange, error) {
var from, to time.Time
for _, mm := range dateRe.FindAllStringSubmatch(s, -1) {
d, err := ParseDate(mm[1])
if err != nil {
return TimeRange{}, fmt.Errorf("cannot parse date '%s' from '%s'", mm[1], s)
}
if from.IsZero() {
from = d
} else {
if d.Before(to) {
return TimeRange{}, fmt.Errorf("invalid time range '%s' (wrongly ordered components)", s)
}
}
to = d
}
return TimeRange{from, to}, nil
}
func WeekdayStr(d time.Weekday) string {
switch d {
case time.Monday:
return "Montag"
case time.Tuesday:
return "Dienstag"
case time.Wednesday:
return "Mittwoch"
case time.Thursday:
return "Donnerstag"
case time.Friday:
return "Freitag"
case time.Saturday:
return "Samstag"
case time.Sunday:
return "Sonntag"
}
return "Sonntag"
}
func MonthStr(m time.Month) string {
switch m {
case time.January:
return "Januar"
case time.February:
return "Februar"
case time.March:
return "März"
case time.April:
return "April"
case time.May:
return "Mai"
case time.June:
return "Juni"
case time.July:
return "Juli"
case time.August:
return "August"
case time.September:
return "September"
case time.October:
return "Oktober"
case time.November:
return "November"
case time.December:
return "Dezember"
}
return "Dezember"
}
func InsertWeekdays(s string) (string, error) {
replacements := make(map[string]string)
for _, mm := range dateRe.FindAllStringSubmatch(s, -1) {
d, err := ParseDate(mm[1])
if err != nil {
return s, fmt.Errorf("cannot parse date '%s' from '%s'", mm[1], s)
}
replacements[mm[1]] = fmt.Sprintf("%s, %s", WeekdayStr(d.Weekday()), mm[1])
}
// insert weekdays
for s1, s2 := range replacements {
s = strings.ReplaceAll(s, s1, s2)
}
return s, nil
}