go time常用方法

前言

最近开发项目经常用到go的time包, 照python的略微麻烦一些, 特别是那个layout被无数人吐槽(包括我), 这里整理了一些常用的方法, 有需要的可以了解一下

package main

import (
	"time"
	"fmt"
)

// GetMonthStartAndEndTime 获取月份的起止时间
func GetMonthStartAndEndTime(month time.Month) (start, end int64) {
	t := time.Now()
	start = time.Date(t.Year(), t.Month()+month, 1, 0, 0, 0, 0, t.Location()).Unix()
	end = time.Date(t.Year(), t.Month()+month+1, 0, 0, 0, 0, 0, t.Location()).Unix()
	return
}

func main() {
	// time函数  layout  2006-01-02 15:04:05

	//生成时间
	time.Now()
	time.Now().Unix()

	//时间转换  time.Format  根据更改layout转成任何自己想要的格式化字段
	time.Now().Format("2006-01-02")
	time.Now().Format("200601")

	//格式时间转换为time类型
	a := "20190606"
	b, _ := time.Parse("20060102", a)
	fmt.Println(b.Unix())
	//时间戳转为time类型
	t := time.Unix(time.Now().Unix(), 0)
	fmt.Println(t)

	//time时间操作
	tomrrow := time.Now().AddDate(0, 0, 1) //明天
	time.Now().AddDate(0, -1, 0)           //上月
	//也可以是一段时间
	fmt.Println(t.Add(time.Duration(10) * time.Minute))

	//判断时间前后
	bol1 := t.After(tomrrow)
	bol2 := t.Before(tomrrow)
	fmt.Println(bol1, bol2)

	//计算日期时间差  一般都是跟 Add方法一块使用
	fmt.Println(t.Sub(tomrrow))
	
	//计算日期离今天间隔几天
	aaa, _ := time.Parse("20060102", a)
	fmt.Println(int64(aaa.Sub(time.Now()).Hours() / 24))
	
	//获取明天凌晨的时间戳
	t = time.Now()
	zero := time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location()).Unix()
	fmt.Println(zero)
	
	// 获取上月的起止时间
	fmt.Println(GetMonthStartAndEndTime(-1))
}

在 Golang 中,可以使用一些库来对时间序列进行重新采样。其中比较常用的是 `gonum.org/v1/plot/plotter` 和 `github.com/montanaflynn/stats`。 `gonum.org/v1/plot/plotter` 提供了 `XYValues` 和 `XYs` 两种数据类型来存储时间序列数据,可以使用 `gonum.org/v1/plot/plotutil` 中的 `Resample` 函数来进行重新采样。例如,将一个时间序列数据从每秒钟采样降低到每分钟采样可以这样实现: ``` import ( "time" "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/plotutil" ) func resampleXYValues(data plotter.XYValues, interval time.Duration) plotter.XYValues { resampled := make(plotter.XYValues, 0, len(data)) start := data[0].X end := data[len(data)-1].X for t := start; t.Before(end); t = t.Add(interval) { var sumX, sumY float64 var count int for _, p := range data { if p.X.After(t) && p.X.Before(t.Add(interval)) { sumX += p.X.UnixNano() sumY += p.Y count++ } } if count > 0 { resampled = append(resampled, plotter.XY{X: time.Unix(0, int64(sumX)/int64(count)), Y: sumY / float64(count)}) } } return resampled } func main() { data := plotter.XYValues{ {X: time.Now().Add(-time.Hour), Y: 10}, {X: time.Now().Add(-30 * time.Minute), Y: 20}, {X: time.Now().Add(-15 * time.Minute), Y: 30}, {X: time.Now(), Y: 40}, } interval := time.Minute resampled := resampleXYValues(data, interval) plotutil.NewScatter(resampled).Save(4*vg.Inch, 4*vg.Inch, "resampled.png") } ``` `github.com/montanaflynn/stats` 提供了 `stats.Float64Data` 数据类型来存储时间序列数据,可以使用 `stats.Sample` 和 `stats.SampleInterpolation` 函数来进行重新采样。例如,将一个时间序列数据从每秒钟采样降低到每分钟采样可以这样实现: ``` import ( "time" "github.com/montanaflynn/stats" ) func resampleFloat64Data(data stats.Float64Data, interval time.Duration) stats.Float64Data { resampled := make(stats.Float64Data, 0, len(data)) start := data[0] end := data[len(data)-1] for t := start; t.Before(end); t = t.Add(interval) { subset, _ := data.Window(t, t.Add(interval)) if len(subset) > 0 { value, _ := stats.Mean(subset) resampled = append(resampled, value) } } return resampled } func main() { data := stats.Float64Data{10, 20, 30, 40} interval := time.Minute resampled := resampleFloat64Data(data, interval) // Do something with resampled data } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小僵尸打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值