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包的使用

                 

      

  • 相关阅读:
    BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
    poj1286
    P1066 2^k进制数
    开车旅行
    洛谷P1396 营救
    poj1840
    poj3693
    poj1195
    3955 最长严格上升子序列(加强版)
    1021 玛丽卡
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/13531758.html
Copyright © 2011-2022 走看看