From a694f36f46dff2bb800009e2c701b6dd7c0a4e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Thu, 27 Oct 2022 17:50:28 +0200 Subject: [PATCH] add tz params to timeext --- timeext/time.go | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/timeext/time.go b/timeext/time.go index 93ef670..272347c 100644 --- a/timeext/time.go +++ b/timeext/time.go @@ -17,14 +17,14 @@ func init() { } // TimeToDatePart returns a timestamp at the start of the day which contains t (= 00:00:00) -func TimeToDatePart(t time.Time) time.Time { - t = t.In(TimezoneBerlin) +func TimeToDatePart(t time.Time, tz *time.Location) time.Time { + t = t.In(tz) return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) } // TimeToWeekStart returns a timestamp at the start of the week which contains t (= Monday 00:00:00) -func TimeToWeekStart(t time.Time) time.Time { - t = TimeToDatePart(t) +func TimeToWeekStart(t time.Time, tz *time.Location) time.Time { + t = TimeToDatePart(t, tz) delta := time.Duration(((int64(t.Weekday()) + 6) % 7) * 24 * int64(time.Hour)) t = t.Add(-1 * delta) @@ -33,32 +33,32 @@ func TimeToWeekStart(t time.Time) time.Time { } // TimeToMonthStart returns a timestamp at the start of the month which contains t (= yyyy-MM-00 00:00:00) -func TimeToMonthStart(t time.Time) time.Time { - t = t.In(TimezoneBerlin) +func TimeToMonthStart(t time.Time, tz *time.Location) time.Time { + t = t.In(tz) return time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location()) } // TimeToMonthEnd returns a timestamp at the end of the month which contains t (= yyyy-MM-31 23:59:59.999999999) -func TimeToMonthEnd(t time.Time) time.Time { - return TimeToMonthStart(t).AddDate(0, 1, 0).Add(-1) +func TimeToMonthEnd(t time.Time, tz *time.Location) time.Time { + return TimeToMonthStart(t, tz).AddDate(0, 1, 0).Add(-1) } // TimeToYearStart returns a timestamp at the start of the year which contains t (= yyyy-01-01 00:00:00) -func TimeToYearStart(t time.Time) time.Time { - t = t.In(TimezoneBerlin) +func TimeToYearStart(t time.Time, tz *time.Location) time.Time { + t = t.In(tz) return time.Date(t.Year(), 1, 1, 0, 0, 0, 0, t.Location()) } // TimeToYearEnd returns a timestamp at the end of the month which contains t (= yyyy-12-31 23:59:59.999999999) -func TimeToYearEnd(t time.Time) time.Time { - return TimeToYearStart(t).AddDate(1, 0, 0).Add(-1) +func TimeToYearEnd(t time.Time, tz *time.Location) time.Time { + return TimeToYearStart(t, tz).AddDate(1, 0, 0).Add(-1) } // IsSameDayIncludingDateBoundaries returns true if t1 and t2 are part of the same day (TZ/Berlin), the boundaries of the day are // inclusive, this means 2021-09-15T00:00:00 is still part of the day 2021-09-14 -func IsSameDayIncludingDateBoundaries(t1 time.Time, t2 time.Time) bool { - dp1 := TimeToDatePart(t1) - dp2 := TimeToDatePart(t2) +func IsSameDayIncludingDateBoundaries(t1 time.Time, t2 time.Time, tz *time.Location) bool { + dp1 := TimeToDatePart(t1, tz) + dp2 := TimeToDatePart(t2, tz) if dp1.Equal(dp2) { return true @@ -72,9 +72,9 @@ func IsSameDayIncludingDateBoundaries(t1 time.Time, t2 time.Time) bool { } // IsDatePartEqual returns true if a and b have the same date part (`yyyy`, `MM` and `dd`) -func IsDatePartEqual(a time.Time, b time.Time) bool { - yy1, mm1, dd1 := a.In(TimezoneBerlin).Date() - yy2, mm2, dd2 := b.In(TimezoneBerlin).Date() +func IsDatePartEqual(a time.Time, b time.Time, tz *time.Location) bool { + yy1, mm1, dd1 := a.In(tz).Date() + yy2, mm2, dd2 := b.In(tz).Date() return yy1 == yy2 && mm1 == mm2 && dd1 == dd2 } @@ -82,7 +82,7 @@ func IsDatePartEqual(a time.Time, b time.Time) bool { // WithTimePart returns a timestamp with the date-part (`yyyy`, `MM`, `dd`) from base // and the time (`HH`, `mm`, `ss`) from the parameter func WithTimePart(base time.Time, hour, minute, second int) time.Time { - datepart := TimeToDatePart(base) + datepart := TimeToDatePart(base, base.Location()) delta := time.Duration(hour*int(time.Hour) + minute*int(time.Minute) + second*int(time.Second)) @@ -92,7 +92,7 @@ func WithTimePart(base time.Time, hour, minute, second int) time.Time { // CombineDateAndTime returns a timestamp with the date-part (`yyyy`, `MM`, `dd`) from the d parameter // and the time (`HH`, `mm`, `ss`) from the t parameter func CombineDateAndTime(d time.Time, t time.Time) time.Time { - datepart := TimeToDatePart(d) + datepart := TimeToDatePart(d, d.Location()) delta := time.Duration(t.Hour()*int(time.Hour) + t.Minute()*int(time.Minute) + t.Second()*int(time.Second) + t.Nanosecond()*int(time.Nanosecond)) @@ -100,8 +100,8 @@ func CombineDateAndTime(d time.Time, t time.Time) time.Time { } // IsSunday returns true if t is a sunday (in TZ/Berlin) -func IsSunday(t time.Time) bool { - if t.In(TimezoneBerlin).Weekday() == time.Sunday { +func IsSunday(t time.Time, tz *time.Location) bool { + if t.In(tz).Weekday() == time.Sunday { return true } return false @@ -131,3 +131,7 @@ func UnixFloatSeconds(v float64) time.Time { sec, dec := math.Modf(v) return time.Unix(int64(sec), int64(dec*(1e9))) } + +func FloorTime(t time.Time) time.Time { + return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) +}