zoukankan      html  css  js  c++  java
  • Go语言中时间片处理

         工作中需要创建连续的时间片,找了许久,没找到Go语言快速生成时间片的函数包,算了,自己写一个吧

         该函数类似于python中的pd.date_range()函数,功能相似,但是略有不同。

         函数功能说明:

           Start, End 为起止时间

      根据feq的不同,当feq大于0时,可根据需要分的时间片个数分;

                                当feq小于0时,可以根据自己设定格式分,其中,-1:Second -2:Minute -3:Hour -4:Day -5:Month,各有所指,此时,slice输入为要分的具体数值,feq为单位

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    // TimeSlice ...
    type TimeSlice struct {
    	StartTime time.Time `json:"start_time"`
    	EndTime   time.Time `json:"end_time"`
    }
    
    // GenTimeSlice ...
    // 参数说明:
    // Start  End   time.Time    起止时间
    // feq          int			 可输入的值(正数:时间片个数另可作为slice的单位:-1:Second   -2:Minute  -3:Hour  -4:Day  -5:Month)
    // slice        float32      浮点数:  时间片的大小,单位由feq决定
    func GenTimeSlice(Start, End time.Time, feq int, slice float32) ([]TimeSlice, bool) {
    	if Start.After(End) {
    		return nil, false
    	}
    	result := []TimeSlice{TimeSlice{Start, End}}
    	if feq > 0 {
    		// 按个数生成时间片
    		result = genByNums(Start, End, feq)
    		return result, true
    	}
    	if slice <= 0 {
    		return result, true
    	}
    	Gap := End.Unix() - Start.Unix()
    	var Step int64
    	switch feq {
    	case -1: // Second
    		Step = int64(slice)
    		break
    	case -2: // Minute
    		Step = int64(slice * 60)
    		break
    	case -3: // Hour
    		Step = int64(slice * 60 * 60)
    		break
    	case -4: // Day
    		Step = int64(slice * 60 * 60 * 24)
    		break
    	case -5: // Week
    		Step = int64(slice * 60 * 60 * 24 * 7)
    		break
    	case -6: // Month
    		Step = int64(slice * 60 * 60 * 24 * 30)
    		break
    	default:
    		return result, true
    	}
    	if Gap < Step {
    		return result, true
    	}
    	result = genByStep(Start, End, Step)
    	return result, true
    }
    
    // genByMin ...
    func genByStep(Start, End time.Time, Step int64) []TimeSlice {
    	timeDistance := End.Unix() - Start.Unix()
    	count := timeDistance / Step
    	result := make([]TimeSlice, 0)
    	for i := 0; i < int(count); i++ {
    		newGap := int64(i)*Step + Start.Unix()
    		start := time.Unix(newGap, 0)
    		newGap = int64(i+1)*Step + Start.Unix()
    		end := time.Unix(newGap, 0)
    		timeSliceTmp := TimeSlice{StartTime: start, EndTime: end}
    		result = append(result, timeSliceTmp)
    	}
    	return result
    }
    
    // genByNums ...
    func genByNums(Start, End time.Time, feq int) []TimeSlice {
    	timeDistance := End.Unix() - Start.Unix()
    	timeStep := timeDistance / int64(feq)
    	result := make([]TimeSlice, 0)
    	for i := 0; i < feq; i++ {
    		newGap := int64(i)*timeStep + Start.Unix()
    		start := time.Unix(newGap, 0)
    		newGap = int64(i+1)*timeStep + Start.Unix()
    		end := time.Unix(newGap, 0)
    		timeSliceTmp := TimeSlice{StartTime: start, EndTime: end}
    		result = append(result, timeSliceTmp)
    	}
    	return result
    }
    
    func main() {
    	s1 := time.Unix(1568516266, 0)
    	s2 := time.Now().Local()
    	if kkk, ok := GenTimeSlice(s1, s2, -3, 2.5); ok {
    		fmt.Println("序号", "	", "起始时间", "		", "终止时间")
    		for i, val := range kkk {
    			fmt.Println(i+1, "	", val.StartTime.Format("2006-01-02 15:04"), "	", val.EndTime.Format("2006-01-02 15:04"))
    		}
    	}
    }
    

        输出:

    序号 	 起始时间 		 终止时间
    1 	 2019-09-15 10:57 	 2019-09-15 13:27
    2 	 2019-09-15 13:27 	 2019-09-15 15:57
    3 	 2019-09-15 15:57 	 2019-09-15 18:27
    4 	 2019-09-15 18:27 	 2019-09-15 20:57
    5 	 2019-09-15 20:57 	 2019-09-15 23:27
    6 	 2019-09-15 23:27 	 2019-09-16 01:57
    7 	 2019-09-16 01:57 	 2019-09-16 04:27
    ...
    

      

      

      附注:Go中Time包的使用

                 

      

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/13531758.html
Copyright © 2011-2022 走看看