2024-08-09 03:24:54 +02:00
|
|
|
// Copyright 2024, Command Line Inc.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
package daystr
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"regexp"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2024-09-05 23:25:45 +02:00
|
|
|
"github.com/wavetermdev/waveterm/pkg/util/utilfn"
|
2024-08-09 03:24:54 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var customDayStrRe = regexp.MustCompile(`^((?:\d{4}-\d{2}-\d{2})|today|yesterday|bom|bow)?((?:[+-]\d+[dwm])*)$`)
|
|
|
|
var daystrRe = regexp.MustCompile(`^(\d{4})-(\d{2})-(\d{2})$`)
|
|
|
|
|
|
|
|
func GetCurDayStr() string {
|
|
|
|
now := time.Now()
|
|
|
|
dayStr := now.Format("2006-01-02")
|
|
|
|
return dayStr
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetRelDayStr(relDays int) string {
|
|
|
|
now := time.Now()
|
|
|
|
dayStr := now.AddDate(0, 0, relDays).Format("2006-01-02")
|
|
|
|
return dayStr
|
|
|
|
}
|
|
|
|
|
|
|
|
// accepts a custom format string to return a daystr
|
|
|
|
// can be either a prefix, a delta, or a prefix w/ a delta
|
|
|
|
// if no prefix is given, "today" is assumed
|
|
|
|
// examples: today-2d, bow, bom+1m-1d (that's end of the month), 2024-04-01+1w
|
|
|
|
//
|
|
|
|
// prefixes:
|
|
|
|
//
|
|
|
|
// yyyy-mm-dd
|
|
|
|
// today
|
|
|
|
// yesterday
|
|
|
|
// bom (beginning of month)
|
|
|
|
// bow (beginning of week -- sunday)
|
|
|
|
//
|
|
|
|
// deltas:
|
|
|
|
//
|
|
|
|
// +[n]d, -[n]d (e.g. +1d, -5d)
|
|
|
|
// +[n]w, -[n]w (e.g. +2w)
|
|
|
|
// +[n]m, -[n]m (e.g. -1m)
|
|
|
|
// deltas can be combined e.g. +1w-2d
|
|
|
|
func GetCustomDayStr(format string) (string, error) {
|
|
|
|
m := customDayStrRe.FindStringSubmatch(format)
|
|
|
|
if m == nil {
|
|
|
|
return "", fmt.Errorf("invalid daystr format")
|
|
|
|
}
|
|
|
|
prefix, deltas := m[1], m[2]
|
|
|
|
if prefix == "" {
|
|
|
|
prefix = "today"
|
|
|
|
}
|
|
|
|
var rtnTime time.Time
|
|
|
|
now := time.Now()
|
|
|
|
switch prefix {
|
|
|
|
case "today":
|
|
|
|
rtnTime = now
|
|
|
|
case "yesterday":
|
|
|
|
rtnTime = now.AddDate(0, 0, -1)
|
|
|
|
case "bom":
|
|
|
|
rtnTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
|
|
|
|
case "bow":
|
|
|
|
weekday := now.Weekday()
|
|
|
|
if weekday == time.Sunday {
|
|
|
|
rtnTime = now
|
|
|
|
} else {
|
|
|
|
rtnTime = now.AddDate(0, 0, -int(weekday))
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
m = daystrRe.FindStringSubmatch(prefix)
|
|
|
|
if m == nil {
|
|
|
|
return "", fmt.Errorf("invalid prefix format")
|
|
|
|
}
|
|
|
|
year, month, day := m[1], m[2], m[3]
|
|
|
|
yearInt, monthInt, dayInt := utilfn.AtoiNoErr(year), utilfn.AtoiNoErr(month), utilfn.AtoiNoErr(day)
|
|
|
|
if yearInt == 0 || monthInt == 0 || dayInt == 0 {
|
|
|
|
return "", fmt.Errorf("invalid prefix format")
|
|
|
|
}
|
|
|
|
rtnTime = time.Date(yearInt, time.Month(monthInt), dayInt, 0, 0, 0, 0, now.Location())
|
|
|
|
}
|
|
|
|
for _, delta := range regexp.MustCompile(`[+-]\d+[dwm]`).FindAllString(deltas, -1) {
|
|
|
|
deltaVal, err := strconv.Atoi(delta[1 : len(delta)-1])
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("invalid delta format")
|
|
|
|
}
|
|
|
|
if delta[0] == '-' {
|
|
|
|
deltaVal = -deltaVal
|
|
|
|
}
|
|
|
|
switch delta[len(delta)-1] {
|
|
|
|
case 'd':
|
|
|
|
rtnTime = rtnTime.AddDate(0, 0, deltaVal)
|
|
|
|
case 'w':
|
|
|
|
rtnTime = rtnTime.AddDate(0, 0, deltaVal*7)
|
|
|
|
case 'm':
|
|
|
|
rtnTime = rtnTime.AddDate(0, deltaVal, 0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rtnTime.Format("2006-01-02"), nil
|
|
|
|
}
|