package main import ( // External werr "git.gibonuddevalla.se/go/wrappederror" // Standard "regexp" "strconv" "time" ) var rxpTimezone *regexp.Regexp func init() { rxpTimezone = regexp.MustCompile(`(\d\d)(\d\d)$`) } func stringToTime(strTime string) (t time.Time, err error) { // {{{ // `date` command %z gives timezone like +0200 instead of +02:00. // This can easily be fixed here, not requiring all scripts to be fixed. t, err = time.Parse(time.RFC3339, strTime) if err != nil { // Check for aforementioned problem. parseError, ok := err.(*time.ParseError) if ok && parseError != nil && parseError.LayoutElem == "Z07:00" { // Insert the missing colon according to RFC 3339 and try again. patchedTimeStr := rxpTimezone.ReplaceAllString(strTime, `$1:$2`) t, err = time.Parse(time.RFC3339, patchedTimeStr) } // Couldn't convert to time.ParseError or the retry // failed. Either way, an error occurs. if err != nil { err = werr.Wrap(err).WithData(strTime) return } } return } // }}} func parseHTMLDateTime(str string, dflt time.Time) (t time.Time, err error) { // {{{ // Browser sending 2024-06-27T10:43 (16 characters) when seconds is 00. if len(str) == 16 { str += ":00" } if str == "" { return dflt, nil } else { t, err = time.ParseInLocation("2006-01-02T15:04:05", str, smonConfig.Timezone()) if err != nil { err = werr.Wrap(err) } } return } // }}} func applyTimeOffset(t time.Time, duration time.Duration, amountStr string) time.Time { // {{{ amount, err := strconv.Atoi(amountStr) if err != nil { return t } return t.Add(duration * time.Duration(amount)) } // }}} func presetTimeInterval(duration time.Duration, presetStr string, timeFrom, timeTo *time.Time) () { if presetStr == "" { return } now := time.Now() presetTime, _ := strconv.Atoi(presetStr) (*timeFrom) = now.Add(duration * -1 * time.Duration(presetTime)) (*timeTo) = now return }