From 555e185871e6485823b010661cd27f7b18797004 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 24 Mar 2022 16:01:41 +0800 Subject: [PATCH] feat: add unix date conversion --- datetime/conversion.go | 60 +++++++++++++++++++++++++++++++++++++ datetime/conversion_test.go | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 datetime/conversion.go create mode 100644 datetime/conversion_test.go diff --git a/datetime/conversion.go b/datetime/conversion.go new file mode 100644 index 0000000..ddf01fb --- /dev/null +++ b/datetime/conversion.go @@ -0,0 +1,60 @@ +// Copyright 2021 dudaodong@gmail.com. All rights reserved. +// Use of this source code is governed by MIT license. + +package datetime + +import "time" + +type theTime struct { + unix int64 +} + +// NewUnixNow return unix timestamp of current time +func NewUnixNow() *theTime { + return &theTime{unix: time.Now().Unix()} +} + +// NewUnix return unix timestamp of specified time +func NewUnix(unix int64) *theTime { + return &theTime{unix: unix} +} + +// NewFormat return unix timestamp of specified time string, t should be "yyyy-mm-dd hh:mm:ss" +func NewFormat(t string) (*theTime, error) { + timeLayout := "2006-01-02 15:04:05" + loc := time.FixedZone("CST", 8*3600) + tt, err := time.ParseInLocation(timeLayout, t, loc) + if err != nil { + return nil, err + } + return &theTime{unix: tt.Unix()}, nil +} + +// NewISO8601 return unix timestamp of specified iso8601 time string +func NewISO8601(iso8601 string) (*theTime, error) { + t, err := time.ParseInLocation(time.RFC3339, iso8601, time.UTC) + if err != nil { + return nil, err + } + return &theTime{unix: t.Unix()}, nil +} + +// ToUnix return unix timestamp +func (t *theTime) ToUnix() int64 { + return t.unix +} + +// ToFormat return the time string 'yyyy-mm-dd hh:mm:ss' of unix time +func (t *theTime) ToFormat() string { + return time.Unix(t.unix, 0).Format("2006-01-02 15:04:05") +} + +// ToFormatForTpl return the time string which format is specified tpl +func (t *theTime) ToFormatForTpl(tpl string) string { + return time.Unix(t.unix, 0).Format(tpl) +} + +// ToFormatForTpl return iso8601 time string +func (t *theTime) ToIso8601() string { + return time.Unix(t.unix, 0).Format(time.RFC3339) +} diff --git a/datetime/conversion_test.go b/datetime/conversion_test.go new file mode 100644 index 0000000..d5124ae --- /dev/null +++ b/datetime/conversion_test.go @@ -0,0 +1,54 @@ +package datetime + +import ( + "testing" + + "github.com/duke-git/lancet/internal" +) + +func TestToUnix(t *testing.T) { + assert := internal.NewAssert(t, "TestToUnix") + + tm1 := NewUnixNow() + unixTimestamp := tm1.ToUnix() + tm2 := NewUnix(unixTimestamp) + + assert.Equal(tm1, tm2) +} + +func TestToFormat(t *testing.T) { + assert := internal.NewAssert(t, "TestToFormat") + + tm, err := NewFormat("2022/03/18 17:04:05") + assert.IsNotNil(err) + + tm, err = NewFormat("2022-03-18 17:04:05") + assert.IsNil(err) + + t.Log("ToFormat -> ", tm.ToFormat()) +} + +func TestToFormatForTpl(t *testing.T) { + assert := internal.NewAssert(t, "TestToFormatForTpl") + + tm, err := NewFormat("2022/03/18 17:04:05") + assert.IsNotNil(err) + + tm, err = NewFormat("2022-03-18 17:04:05") + assert.IsNil(err) + + t.Log("ToFormatForTpl -> ", tm.ToFormatForTpl("2006/01/02 15:04:05")) + +} + +func TestToIso8601(t *testing.T) { + assert := internal.NewAssert(t, "TestToIso8601") + + tm, err := NewISO8601("2022-03-18 17:04:05") + assert.IsNotNil(err) + + tm, err = NewISO8601("2006-01-02T15:04:05.999Z") + assert.IsNil(err) + + t.Log("ToIso8601 -> ", tm.ToIso8601()) +}