From deb0fdd26f547397715316cbf9b6cb2f60a0c625 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Mon, 13 May 2024 13:34:12 +0300 Subject: [PATCH] add functions for operation with TimeOfDay googleapis type --- pkg/datetime/datetime.go | 31 +++++++++++++++++++++++++++++- pkg/datetime/datetime_test.go | 36 +++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/pkg/datetime/datetime.go b/pkg/datetime/datetime.go index 4c1033c..8269539 100644 --- a/pkg/datetime/datetime.go +++ b/pkg/datetime/datetime.go @@ -13,6 +13,7 @@ import ( dpb "google.golang.org/genproto/googleapis/type/date" dtpb "google.golang.org/genproto/googleapis/type/datetime" + tod "google.golang.org/genproto/googleapis/type/timeofday" durpb "google.golang.org/protobuf/types/known/durationpb" ) @@ -40,7 +41,10 @@ func TimeToISO8601DateTimeStringWrapper(t *time.Time) *wrapperspb.StringValue { } } -func TimeToLocalISO8601DateTimeStringWrapper(t *time.Time, location *time.Location) *wrapperspb.StringValue { +func TimeToLocalISO8601DateTimeStringWrapper( + t *time.Time, + location *time.Location, +) *wrapperspb.StringValue { if t != nil { localTime := (*t).In(location) return TimeToISO8601DateTimeStringWrapper(&localTime) @@ -221,3 +225,28 @@ func IsEndOfDay(t time.Time) bool { return false } } + +func TimeToTimeOfDay(t time.Time) *tod.TimeOfDay { + return &tod.TimeOfDay{ + Hours: int32(t.Hour()), + Minutes: int32(t.Minute()), + Seconds: int32(t.Second()), + Nanos: int32(t.Nanosecond()), + } +} + +func TimeOfDayToTime(t *tod.TimeOfDay) time.Time { + if t == nil { + return time.Time{} + } + return time.Date( + 0, + 1, + 1, + int(t.GetHours()), + int(t.GetMinutes()), + int(t.GetSeconds()), + int(t.GetNanos()), + time.UTC, + ) +} diff --git a/pkg/datetime/datetime_test.go b/pkg/datetime/datetime_test.go index 3e6bae5..22de8f3 100644 --- a/pkg/datetime/datetime_test.go +++ b/pkg/datetime/datetime_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" dpb "google.golang.org/genproto/googleapis/type/date" dtpb "google.golang.org/genproto/googleapis/type/datetime" + tod "google.golang.org/genproto/googleapis/type/timeofday" durpb "google.golang.org/protobuf/types/known/durationpb" ) @@ -204,7 +205,11 @@ func Test_DateTimeZone(t *testing.T) { require.Equal(t, tm.Location().String(), test.tz.GetId()) } if test.offset != nil { - require.Equal(t, tm.Location().String(), fmt.Sprintf("UTC+%d", test.offset.GetSeconds()/3600)) + require.Equal( + t, + tm.Location().String(), + fmt.Sprintf("UTC+%d", test.offset.GetSeconds()/3600), + ) } }) @@ -362,7 +367,10 @@ func Test_TimeToLocalISO8601DateTimeString(t *testing.T) { offsetInHours := (offsetInSeconds / 60) / 60 require.Equal(7, offsetInHours) - require.Equal("2006-01-05T18:04:05+07:00", TimeToLocalISO8601DateTimeString(utcTime, localTime.Location())) + require.Equal( + "2006-01-05T18:04:05+07:00", + TimeToLocalISO8601DateTimeString(utcTime, localTime.Location()), + ) } func Test_IsSameDate(t *testing.T) { @@ -425,3 +433,27 @@ func Test_UTCTimeAdjustedToEndOfDay(t *testing.T) { require.False(IsStartOfDay(utcTime)) require.True(IsEndOfDay(utcTime)) } + +func Test_TimeToTimeOfDay(t *testing.T) { + require := require.New(t) + utcTime, err := ISO8601StringToUTCTime("2006-01-02T11:04:05Z") + if err != nil { + t.Fatal(err) + } + timeOfDay := TimeToTimeOfDay(utcTime) + require.Equal(int32(11), timeOfDay.GetHours()) + require.Equal(int32(4), timeOfDay.GetMinutes()) + require.Equal(int32(5), timeOfDay.GetSeconds()) + require.Equal(int32(0), timeOfDay.GetNanos()) +} + +func Test_TimeOfDayToTime(t *testing.T) { + require := require.New(t) + timeOfDay := &tod.TimeOfDay{ + Hours: 11, + Minutes: 4, + Seconds: 5, + } + utcTime := TimeOfDayToTime(timeOfDay) + require.Equal("0000-01-01T11:04:05Z", TimeToISO8601DateTimeString(utcTime)) +}