package commonus import ( "fmt" "math" "strconv" "time" ) // 时间相关处理类 var ( timeLayoutMap = map[string]string{ "y": "2006", "m": "2006-01", "d": "2006-01-02", "h": "2006-01-02 15", "i": "2006-01-02 15:04", "s": "2006-01-02 15:04:05", } weekDay = map[string]int{ "Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6, "Sunday": 7, } ) /* * 获取本周周一的日期 */ func GetDateOfWeek() (weekMonday string) { now := time.Now() offset := int(time.Monday - now.Weekday()) if offset > 0 { offset = -6 } weekStartDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) weekMonday = weekStartDate.Format("2006-01-02") return } /* * 获取本周周日的日期 */ func GetLastWeekDate() (weekMonday string) { thisWeekMonday := GetDateOfWeek() TimeMonday, _ := time.Parse("2006-01-02", thisWeekMonday) lastWeekMonday := TimeMonday.AddDate(0, 0, +6) weekMonday = lastWeekMonday.Format("2006-01-02") return } /* * 获取上周的周一日期 */ func GetFirstWeekDate() (weekMonday string) { thisWeekMonday := GetDateOfWeek() TimeMonday, _ := time.Parse("2006-01-02", thisWeekMonday) lastWeekMonday := TimeMonday.AddDate(0, 0, -7) weekMonday = lastWeekMonday.Format("2006-01-02") return } /* * 获取上周的周日日期 */ func GetFirstWeekLastDate() (weekMonday string) { thisWeekMonday := GetFirstWeekDate() TimeMonday, _ := time.Parse("2006-01-02", thisWeekMonday) lastWeekMonday := TimeMonday.AddDate(0, 0, +6) weekMonday = lastWeekMonday.Format("2006-01-02") return } /* * 获取指定日期的上周的周一日期 */ func GetFirstWeekDateSet(thisWeekMonday string) (weekMonday string) { TimeMonday, _ := time.Parse("2006-01-02", thisWeekMonday) lastWeekMonday := TimeMonday.AddDate(0, 0, -7) weekMonday = lastWeekMonday.Format("2006-01-02") return } /* 获取今天时间 */ func GetToDay() (yesterday string) { now := time.Now() yesTime := now.AddDate(0, 0, 0).Format("2006-01-02") // 获取昨天的时间 return yesTime } func GetToDayAll() (yesterday string) { now := time.Now() yesTime := now.AddDate(0, 0, 0).Format("2006-01-02 15:04:05") // 获取昨天的时间 return yesTime } /* 获取昨天时间 */ func GetYesterDay() (yesterday string) { now := time.Now() yesTime := now.AddDate(0, 0, -1).Format("2006-01-02") // 获取昨天的时间 return yesTime } /* 日期转时间戳 */ func DateToTimeStamp(dataStr string) (timeStamp int64) { tmp := "2006-01-02 15:04:05" res, _ := time.ParseInLocation(tmp, dataStr, time.Local) timeStamp = res.Unix() return } func DateToTimeStampEs(dataStr string) (timeStamp int64, isTrue bool) { isTrue = false tmp := "2006-01-02 15:04:05" res, err := time.ParseInLocation(tmp, dataStr, time.Local) timeStamp = res.Unix() if err == nil { isTrue = true } return } /* 时间戳转日期 */ func TimeStampToDate(timeStamp int64, timeType int) (dateStr string) { timeTemplate := "2006-01-02 15:04:05" //常规类型 switch timeType { case 1: timeTemplate = "2006/01/02 15:04:05" case 2: timeTemplate = "2006/01/02 15:04" case 3: timeTemplate = "2006/01/02 15" case 4: timeTemplate = "2006/01/02" case 5: timeTemplate = "15:04:05" case 6: timeTemplate = "2006-01-02" case 7: timeTemplate = "2006-01-02 15" case 8: timeTemplate = "2006-01-02 15:04" case 9: timeTemplate = "02" case 10: timeTemplate = "2006-01" case 11: timeTemplate = "2006" //年 case 12: timeTemplate = "01" //月 case 13: //季度 dayMonth := time.Unix(timeStamp, 0).Format("01") datMonthFloat, datMonthFloatErr := strconv.ParseFloat(dayMonth, 10) if datMonthFloatErr == nil { dateStr = strconv.FormatFloat(math.Ceil(datMonthFloat/3), 'f', -1, 64) } else { dateStr = "1" } // fmt.Printf("dayMonth ---------->%v-----dateStr-->%v---datMonthFloat--->%v---datMonthFloatErr-->%v\n", dayMonth, dateStr, datMonthFloat, datMonthFloatErr) return case 14: timeTemplate = "20060102" case 15: timeTemplate = "01-02" default: timeTemplate = "2006-01-02 15:04:05" //常规类型 } dateStr = time.Unix(timeStamp, 0).Format(timeTemplate) return } // 时间计算(年、季、月、周、日、时、分、秒) func ComputingTime(timeStamp int64, timeType int) (timeDataInt int64) { var timeData string = "1" switch timeType { case 1: timeData = time.Unix(timeStamp, 0).Format("2006") //年 case 2: dayMonth := time.Unix(timeStamp, 0).Format("01") //季度 datMonthFloat, datMonthFloatErr := strconv.ParseFloat(dayMonth, 10) if datMonthFloatErr == nil { timeData = strconv.FormatFloat(math.Ceil(datMonthFloat/3), 'f', -1, 64) } else { timeData = "1" } case 3: timeData = time.Unix(timeStamp, 0).Format("01") //月份 case 4: //当前日期为本月第几周 monthFirstDayStr := DateToTimeStamp(TimeStampToDate(timeStamp, 10) + "-01 00:00:00") //获取指定月第一天时间戳 dayTime := time.Unix(monthFirstDayStr, 0) dayOfWeek := int(dayTime.Weekday()) //获取本月第一天是周几 if dayOfWeek == 0 { dayOfWeek = 7 } dayNumber, dayNumberErr := strconv.ParseInt(TimeStampToDate(timeStamp, 9), 10, 64) //获取今天是几号 if dayNumberErr != nil { dayNumber = 1 } daysAndWeeksDiff := dayNumber - (8 - int64(dayOfWeek)) if daysAndWeeksDiff <= 0 { timeData = "1" } else { daysAndWeeksDiffFlot, daysAndWeeksDiffFloatErr := strconv.ParseFloat(strconv.FormatInt(daysAndWeeksDiff, 10), 10) if daysAndWeeksDiffFloatErr == nil { daysWeeksDiffVal := math.Ceil(daysAndWeeksDiffFlot/7) + 1 timeData = strconv.FormatFloat(daysWeeksDiffVal, 'f', -1, 64) } else { timeData = "1" } } case 5: timeData = time.Unix(timeStamp, 0).Format("02") //天 case 7: timeData = time.Unix(timeStamp, 0).Format("15") //时 case 8: timeData = time.Unix(timeStamp, 0).Format("04") //分 case 9: timeData = time.Unix(timeStamp, 0).Format("05") //秒 default: timeData = "0" } timeDataInt, timeDataIntErr := strconv.ParseInt(timeData, 10, 64) if timeDataIntErr != nil { timeDataInt = 0 return } return } /* 指定日期起止时间戳 @startTime @endTime */ func GetStartAndEndTimeStamp(startTime, endTime string) (startTimeStamp, endTimeStamp int64) { startTimeStr := startTime + " 00:00:00" endTimeStr := endTime + " 23:59:59" startTimeStamp = DateToTimeStamp(startTimeStr) endTimeStamp = DateToTimeStamp(endTimeStr) return } // 获取两个时间相差的天数,0表同一天,正数表t1>t2,负数表t1t2,负数表t1 0 { strarTime = monthStartTimgStamp } if monthEndTimeStamp-endTime < 0 { endTime = monthEndTimeStamp } monthFirstDay := time.Unix(monthStartTimgStamp, 0).Weekday().String() //指定日期所在月第一天是周几 todayInt := t.Local().Day() //今天几号 currentWeek := weekDay[monthFirstDay] //指定日期所在月第一天是周几(转换成int定量) daySet := todayInt - (8 - currentWeek) //日期差量 if daySet <= 0 { weekInt = 1 } else { weekInt = int(math.Ceil(float64(daySet)/7.0)) + 1 //计算周 } return } // 计算指定日期周一 func SetDateWeekFirstTime(t time.Time) (weekInt string) { offset := int(time.Monday - t.Weekday()) if offset > 0 { offset = -6 } weekStartDate := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) weekInt = weekStartDate.Format("2006-01-02") return } /* 获取上周起止时间 */ func FirstWeekStartAdnEndTime(t time.Time) (strarTime, endTime int64, weekInt int) { //计算周一 firstWeekDay := SetDateWeekFirstTime(t) //指定日期所在周的周一日期 firstWeekDayStringToTime := StringToTimeIng("d", firstWeekDay) monthFirst := int64(firstWeekDayStringToTime.Month()) //获取周一所在月 monthSet := int64(t.Month()) //当前日期所在月 // fmt.Printf("%v=>%v=>%v\n", firstWeekDay, int(t.Month()), t) strarTime = monthFirst endTime = monthSet weekInt = 250 //判断是否在同一个月 if monthFirst == monthSet { firstWeekDay = firstWeekDay + " 00:00:00" weekFirstDayTime := DateToTimeStamp(firstWeekDay) - 43200 weekFirstDayTimeToStr := TimeStampToDate(weekFirstDayTime, 6) weekDayStrToTime := StringToTimeIng("d", weekFirstDayTimeToStr) strarTime, endTime, weekInt = WeekStartAdnEndTime(weekDayStrToTime) } else { strarTime, endTime, weekInt = WeekStartAdnEndTime(firstWeekDayStringToTime) } return } // 获取指定时间当月第一周起止时间 func GetSetUpDayTimeToMonthStartAndEndTime(monthStartTime int64) (strarTime, endTime int64) { t := time.Unix(monthStartTime, 0) fmt.Println(time.Unix(monthStartTime, 0)) endStr := t.Weekday().String() firstInt := (weekDay[endStr] - 1) lastInt := 7 - weekDay[endStr] plus := int64(86400 * lastInt) //计算结束时间加量 owe := int64(86400 * firstInt) //计算开始时间加量 endDay := time.Unix(t.Unix()+plus+86399, 0) //结束时间 startDay := time.Unix(t.Unix()-owe, 0) //开始时间 strarTime = startDay.Unix() endTime = endDay.Unix() monthStartTimgStamp, monthEndTimeStamp := GetMonthStartOrEndTime(t) if monthStartTimgStamp-strarTime > 0 { strarTime = monthStartTimgStamp } if monthEndTimeStamp-endTime < 0 { endTime = monthEndTimeStamp } return } /* 获取季度的起止时间 */ func GetQuarterDay(t time.Time) (string, int, int64, int64) { year := t.Format("2006") month := int(t.Month()) var firstOfQuarter string var lastOfQuarter string var currentQuarter int if month >= 1 && month <= 3 { //1月1号 firstOfQuarter = year + "-01-01 00:00:00" lastOfQuarter = year + "-03-31 23:59:59" currentQuarter = 1 } else if month >= 4 && month <= 6 { firstOfQuarter = year + "-04-01 00:00:00" lastOfQuarter = year + "-06-30 23:59:59" currentQuarter = 2 } else if month >= 7 && month <= 9 { firstOfQuarter = year + "-07-01 00:00:00" lastOfQuarter = year + "-09-30 23:59:59" currentQuarter = 3 } else { firstOfQuarter = year + "-10-01 00:00:00" lastOfQuarter = year + "-12-31 23:59:59" currentQuarter = 4 } quarterStartTime := DateToTimeStamp(firstOfQuarter) quarterEndTime := DateToTimeStamp(lastOfQuarter) return year, currentQuarter, quarterStartTime, quarterEndTime } // 获取指定时间的前N个月的起止时间 func AppointTimeFrontMonth(timeVal time.Time, diff int) (startTime, endTime int64) { diff = diff * -1 lastMonthFirstDay := timeVal.AddDate(0, diff, -timeVal.Day()+1) startTime = time.Date(lastMonthFirstDay.Year(), lastMonthFirstDay.Month(), lastMonthFirstDay.Day(), 0, 0, 0, 0, timeVal.Location()).Unix() lastMonthEndDay := lastMonthFirstDay.AddDate(0, 1, -1) endTime = time.Date(lastMonthEndDay.Year(), lastMonthEndDay.Month(), lastMonthEndDay.Day(), 23, 59, 59, 0, timeVal.Location()).Unix() return } // 获取上月月份,起止时间 func GetLastMonth() (yearMonth, startMonth, endMonth string) { dataTypeAll := "2006-01-02" dataType := "2006-01" year, month, _ := time.Now().Date() thisMonth := time.Date(year, month, 1, 0, 0, 0, 0, time.Local) startMonth = thisMonth.AddDate(0, -1, 0).Format(dataTypeAll) endMonth = thisMonth.AddDate(0, 0, -1).Format(dataTypeAll) yearMonth = thisMonth.AddDate(0, -1, 0).Format(dataType) // fmt.Printf("year------>%v------year------->%v---thisMonth---->%v---start---->%v---end---->%v---yearMonth---->%v\n", year, month, thisMonth, startMonth, endMonth, yearMonth) return } // 获取指定月的起止时间 func GetAppointMonthStarAndEndTime(dayTime string) (startTime, endTime int64) { dataTypeAll := "2006-01-02" dayTime = fmt.Sprintf("%v-%v", dayTime, "01") firstToTime := StringToTimeIng("d", dayTime) startTimeStr := fmt.Sprintf("%v 00:00:00", firstToTime.AddDate(0, 0, 0).Format(dataTypeAll)) endTimeStr := fmt.Sprintf("%v 23:59:59", firstToTime.AddDate(0, 1, -1).Format(dataTypeAll)) // startTime = dayTime startTime, _ = DateToTimeStampEs(startTimeStr) endTime, _ = DateToTimeStampEs(endTimeStr) return } // 获取指定月的起止时间 func GetAppointMonthStarAndEndTimeInt(monthStartTime int64) (monthStartTimgStamp, monthEndTimeStamp int64) { t := time.Unix(monthStartTime, 0) monthStartTimgStamp, monthEndTimeStamp = GetMonthStartOrEndTime(t) return } // 获取指定月的起止时间副本 func GetAppointMonthStarAndEndTimeEs(dayTime string) (startTime, endTime int64) { dataTypeAll := "2006-01-02" firstToTime := StringToTimeIng("d", dayTime) startTimeStr := fmt.Sprintf("%v 00:00:00", firstToTime.AddDate(0, 0, 0).Format(dataTypeAll)) endTimeStr := fmt.Sprintf("%v 23:59:59", firstToTime.AddDate(0, 1, -1).Format(dataTypeAll)) // startTime = dayTime startTime, _ = DateToTimeStampEs(startTimeStr) endTime, _ = DateToTimeStampEs(endTimeStr) return }