From 6ab04088e24a622b19f487cc23d148482166851f Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 15 Nov 2022 17:54:16 +0100 Subject: [PATCH] Metadata: Accept switch back to local time if current zone is UTC #2876 Signed-off-by: Michael Mayer --- internal/entity/photo_datetime.go | 6 +++-- internal/entity/photo_datetime_test.go | 31 ++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/internal/entity/photo_datetime.go b/internal/entity/photo_datetime.go index 40e4992ab..a994cadbc 100644 --- a/internal/entity/photo_datetime.go +++ b/internal/entity/photo_datetime.go @@ -63,9 +63,11 @@ func (m *Photo) SetTakenAt(taken, local time.Time, zone, source string) { m.TimeZone = zone m.TakenAt = m.GetTakenAt() } else if m.TimeZoneUTC() { - // Local is UTC. m.TimeZone = zone - m.TakenAtLocal = taken + // Keep UTC? + if m.TimeZoneUTC() { + m.TakenAtLocal = taken + } } else if m.TimeZone != "" { // Apply existing time zone. m.TakenAt = m.GetTakenAt() diff --git a/internal/entity/photo_datetime_test.go b/internal/entity/photo_datetime_test.go index 273b4d873..14ab5d5ec 100644 --- a/internal/entity/photo_datetime_test.go +++ b/internal/entity/photo_datetime_test.go @@ -39,20 +39,20 @@ func TestPhoto_TrustedTime(t *testing.T) { } func TestPhoto_SetTakenAt(t *testing.T) { - t.Run("empty taken", func(t *testing.T) { + t.Run("Empty", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) m.SetTakenAt(time.Time{}, time.Time{}, "", SrcManual) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) }) - t.Run("taken not from the same source", func(t *testing.T) { + t.Run("LowerSourcePriority", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) m.SetTakenAt(time.Date(2019, 12, 11, 9, 7, 18, 0, time.UTC), time.Date(2019, 12, 11, 9, 7, 18, 0, time.UTC), "", SrcAuto) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) }) - t.Run("from name", func(t *testing.T) { + t.Run("FromName", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") m.TimeZone = "" m.TakenSrc = SrcAuto @@ -71,7 +71,7 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, time.Date(2011, 12, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2019, 11, 11, 10, 7, 18, 0, time.UTC), m.TakenAtLocal) }) - t.Run("success", func(t *testing.T) { + t.Run("Success", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) @@ -82,7 +82,7 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, time.Date(2019, 12, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2019, 12, 11, 10, 7, 18, 0, time.UTC), m.TakenAtLocal) }) - t.Run("fallback", func(t *testing.T) { + t.Run("Fallback", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, time.November, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2013, time.November, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) @@ -108,7 +108,7 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, expected, m.TakenAt) assert.Equal(t, m.GetTakenAtLocal(), m.TakenAtLocal) }) - t.Run("time zone", func(t *testing.T) { + t.Run("TimeZone", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") zone := "Europe/Berlin" @@ -122,7 +122,7 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, newTime.UTC(), m.TakenAt) assert.Equal(t, newTime, m.TakenAtLocal) }) - t.Run("time > max year", func(t *testing.T) { + t.Run("InvalidYear", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) @@ -131,7 +131,7 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) }) - t.Run("success with empty takenAtLocal", func(t *testing.T) { + t.Run("SuccessLocalEmpty", func(t *testing.T) { m := PhotoFixtures.Get("Photo15") assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) @@ -140,25 +140,32 @@ func TestPhoto_SetTakenAt(t *testing.T) { assert.Equal(t, time.Date(2019, 12, 11, 9, 7, 18, 0, time.UTC), m.TakenAt) assert.Equal(t, time.Date(2019, 12, 11, 9, 7, 18, 0, time.UTC), m.TakenAtLocal) }) - t.Run("don't update older date", func(t *testing.T) { + t.Run("SkipUpdate", func(t *testing.T) { photo := &Photo{TakenAt: time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC)} photo.SetTakenAt(time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), time.Date(2014, 12, 11, 10, 7, 18, 0, time.UTC), "", SrcAuto) assert.Equal(t, time.Date(2013, 11, 11, 9, 7, 18, 0, time.UTC), photo.TakenAt) }) - t.Run("set local time from utc", func(t *testing.T) { + t.Run("LocalFromUTC", func(t *testing.T) { photo := &Photo{TakenAt: time.Date(2015, 11, 11, 9, 7, 18, 0, time.UTC), TimeZone: "Europe/Berlin"} photo.SetTakenAt(time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), time.Date(2014, 12, 11, 10, 7, 18, 0, time.UTC), time.UTC.String(), SrcManual) assert.Equal(t, time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), photo.TakenAt) assert.Equal(t, time.Date(2014, 12, 11, 10, 07, 18, 0, time.UTC), photo.TakenAtLocal) }) - t.Run("local is UTC", func(t *testing.T) { + t.Run("KeepUTC", func(t *testing.T) { + photo := &Photo{TakenAt: time.Date(2015, 11, 11, 9, 7, 18, 0, time.UTC), TimeZone: time.UTC.String()} + photo.SetTakenAt(time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), + time.Date(2014, 12, 11, 10, 7, 18, 0, time.UTC), time.UTC.String(), SrcManual) + assert.Equal(t, time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), photo.TakenAt) + assert.Equal(t, time.Date(2014, 12, 11, 9, 07, 18, 0, time.UTC), photo.TakenAtLocal) + }) + t.Run("UTCToLocal", func(t *testing.T) { photo := &Photo{TakenAt: time.Date(2015, 11, 11, 9, 7, 18, 0, time.UTC), TimeZone: time.UTC.String()} photo.SetTakenAt(time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), time.Date(2014, 12, 11, 10, 7, 18, 0, time.UTC), "", SrcManual) assert.Equal(t, time.Date(2014, 12, 11, 9, 7, 18, 0, time.UTC), photo.TakenAt) - assert.Equal(t, time.Date(2014, 12, 11, 9, 07, 18, 0, time.UTC), photo.TakenAtLocal) + assert.Equal(t, time.Date(2014, 12, 11, 10, 07, 18, 0, time.UTC), photo.TakenAtLocal) }) }