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
package utils
 
import (
    "slices"
    "time"
)
 
// IsOverlap 判断两个时间段是否有重叠
func IsOverlap(start1, end1, start2, end2 string) bool {
    layout := "2006-01-02"
    startTime1, _ := time.Parse(layout, start1)
    endTime1, _ := time.Parse(layout, end1)
    startTime2, _ := time.Parse(layout, start2)
    endTime2, _ := time.Parse(layout, end2)
 
    // 如果一个时间段的开始时间在另一个时间段之后,或结束时间在另一个时间段之前,则无重叠
    if startTime1.After(endTime2) || endTime1.Before(startTime2) {
        return false
    }
 
    return true
}
 
func GetMonthByOffset(offset int) time.Time {
    return time.Now().AddDate(0, offset, 0)
}
 
func GetDayByOffset(offset int) time.Time {
    return time.Now().AddDate(0, 0, offset)
}
 
// GetLastMonthPeriod 返回上个月的月初时间和月末时间
func GetLastMonthPeriod(now time.Time) (firstDay time.Time, lastDay time.Time) {
    // 获取本个月的第一天的日期(即本月月初)
    firstDayOfThisMonth := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
 
    nextMonth := now.AddDate(0, 1, 0)
    // 获取下月第一天的日期(即下个月月初)
    firstDayOfNextMonth := time.Date(nextMonth.Year(), nextMonth.Month(), 1, 0, 0, 0, 0, now.Location())
 
    // 下个月月末时间即为本月月初减去一秒
    lastDayOfThisMonth := firstDayOfNextMonth.Add(-time.Second)
 
    return firstDayOfThisMonth, lastDayOfThisMonth
}
 
func GetMonthDuration(d time.Time) (duration int) {
    return d.AddDate(0, 1, -1).Day()
}
 
func CalcWorkHour(begin, end time.Time, dayOff []time.Weekday, cellHour float32) (workHour float32, workingCount int) {
    var currentTime = begin
    for {
        if currentTime.After(end) {
            break
        }
        if slices.Contains(dayOff, currentTime.Weekday()) {
            // nothing
        } else {
            workHour += cellHour
            workingCount++
        }
        currentTime = currentTime.AddDate(0, 0, 1) // .Add(24 * time.Hour)
    }
 
    return float32(workHour), workingCount
}