如何在Golang中检查RFC3339或ISO8601的时间是否已经过期

284 阅读2分钟

这是一个简单的例子,告诉我们如何通过与当前时间的比较来检查我们的时间是否过期。它假设时间是RFC3339ISO 8601 格式。

代码

package main

import (
	"fmt"
	"time"
)

// expired accepts a `RFC3339`/`ISO 8601` formatted time and
// compares it to the current time to tell if it expired or not.
func expired(now time.Time, v string) (bool, error) {
	fmt.Println("NOW:", now.Format(time.RFC3339))
	fmt.Println("YOU:", v)

	exp, err := time.ParseInLocation(time.RFC3339, v, now.Location())
	if err != nil {
		return false, err
	}

	if now.Sub(exp).Seconds() <= 0 {
		return false, nil
	}

	return true, nil
}

func main() {
	fmt.Println(expired(time.Now().UTC(), "2002-10-02T15:00:00Z"))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), "2021-12-31T03:11:00Z"))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), "2020-07-06T20:20:01+00:00"))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), "2020-08-06T20:20:01+00:00"))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), time.Now().Format(time.RFC3339)))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), time.Now().UTC().Format(time.RFC3339)))
	fmt.Println("------")
	fmt.Println(expired(time.Now().UTC(), time.Now().Add(1*time.Minute).UTC().Format(time.RFC3339)))
	fmt.Println("------")
	fmt.Println(expired(time.Now(), time.Now().Add(1*time.Minute).UTC().Format(time.RFC3339)))
	fmt.Println("------")
	fmt.Println(time.Now().Zone())
	fmt.Println(time.Now().Location())
	fmt.Println(time.Now().UTC().Location())
}

测试

NOW: 2020-07-06T20:47:11Z
YOU: 2002-10-02T15:00:00Z
true 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2021-12-31T03:11:00Z
false 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2020-07-06T20:20:01+00:00
true 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2020-08-06T20:20:01+00:00
false 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2020-07-06T21:47:11+01:00
true 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2020-07-06T20:47:11Z
true 
------
NOW: 2020-07-06T20:47:11Z
YOU: 2020-07-06T20:48:11Z
false 
------
NOW: 2020-07-06T21:47:11+01:00
YOU: 2020-07-06T20:48:11Z
false 
------
BST 3600
Local
UTC