Golang 根据时间间隔生成时间段集合(用于图表展示)
备注:
ParseDuration解析一个时间段字符串。一个时间段字符串是一个序列,每个片段包含可选的正负号、 十进制数、可选的小数部分和单位后缀,如"300ms"、"-1.5h"、"2h45m"。 合法的单位有"ns"纳秒,"us","µs"、"ms"毫秒、"s"秒、"m"分钟、"h"
1.分割时间段用于图标X坐标。
// GetTimePeriodsX 分割时间段用于图标X坐标
// gap 应是加去的时间 如加十分钟:gap, _ := time.ParseDuration("10m")
func GetTimePeriodsX(begin, end time.Time, gap time.Duration) ([]string, error) {
if begin.Unix() >= end.Unix() {
return nil, errors.New("start time is greater than end time!")
}
//分割的时间段
periods := make([]string, 0)
for {
str := begin.Format("15:04")
periods = append(periods, str)
begin = begin.Add(gap)
if begin.Unix() > end.Unix() {
break
}
}
return periods, nil
}
调用:
//时间段间隔
gap, _ := time.ParseDuration("10m")
hour, _ := time.ParseDuration(fmt.Sprintf("-%vh", 1))
begin := time.Now().Add(hour)
end := time.Now()
res, e := GetTimePeriodsX(begin, end, gap)
fmt.Println(e)
for _, t := range res {
fmt.Println(t)
}
2.分割时间段用于数据库查询
// GetTimePeriodsDb 分割时间段用于数据库查询
// gap 应是加去的时间 如加十分钟:gap, _ := time.ParseDuration("10m")
func GetTimePeriodsDb(begin, end time.Time, gap time.Duration) ([]map[string]string, error) {
if begin.Unix() >= end.Unix() {
return nil, errors.New("start time is greater than end time!")
}
if (end.Unix() - begin.Unix()) <= int64(gap.Seconds()) {
return nil, errors.New("gap time is greater than end time!")
}
//分割的时间段
periods := make([]map[string]string, 0)
for {
t := make(map[string]string)
t["begin"] = begin.Format("2006-01-02 15:04")
begin = begin.Add(gap)
t["end"] = begin.Format("2006-01-02 15:04")
periods = append(periods, t)
if begin.Unix() > end.Unix() {
break
}
}
return periods, nil
}
调用:
/时间段间隔
gap, _ := time.ParseDuration("10m")
hour, _ := time.ParseDuration(fmt.Sprintf("-%vh", 1))
begin := time.Now().Add(hour)
end := time.Now()
res, e := GetTimePeriodsDb(begin, end, gap)
fmt.Println(e)
for _, t := range res {
fmt.Println(t)
}
结果: