1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-10 18:10:49 +09:00

GO-4220 Add tz to long date id

This commit is contained in:
kirillston 2024-11-15 13:22:45 +01:00
parent d7e016d50d
commit e0acfc4f55
No known key found for this signature in database
GPG key ID: 88218A7F1109754B
14 changed files with 100 additions and 76 deletions

View file

@ -9,33 +9,33 @@ import (
const (
shortDateIdLayout = "2006-01-02"
dateIdLayout = "2006-01-02-15-04-05"
dateIdLayout = "2006-01-02-15-04-05Z-0700"
dateNameLayout = "02 Jan 2006"
)
// TimeToDateId returns date object id. Its format is _date_YYYY-MM-DD-hh-mm-ss in UTC time zone
func TimeToDateId(t time.Time) string {
return addr.DatePrefix + t.UTC().Format(dateIdLayout)
}
// TimeToShortDateId should not be used to generate Date object id. Use TimeToDateId instead
func TimeToShortDateId(t time.Time) string {
return addr.DatePrefix + t.UTC().Format(shortDateIdLayout)
// TimeToDateId returns date object id. We substitute + with _ in time zone, as + is not supported in object ids on clients
// Format with time is _date_YYYY-MM-DD-hh-mm-ssZ-zzzz. Format without time _date_YYYY-MM-DD
func TimeToDateId(t time.Time, includeTime bool) string {
if includeTime {
formatted := t.Format(dateIdLayout)
formatted = strings.Replace(formatted, "+", "_", 1)
return addr.DatePrefix + formatted
}
return addr.DatePrefix + t.Format(shortDateIdLayout)
}
func ParseDateId(id string) (time.Time, error) {
t, err := time.Parse(dateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
formatted := strings.TrimPrefix(id, addr.DatePrefix)
formatted = strings.Replace(formatted, "_", "+", 1)
t, err := time.Parse(dateIdLayout, formatted)
if err == nil {
return t, nil
}
return time.Parse(shortDateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
return time.ParseInLocation(shortDateIdLayout, formatted, time.Local)
}
func TimeToDateName(t time.Time, loc *time.Location) string {
if loc != nil {
return t.In(loc).Format(dateNameLayout)
}
return t.Local().Format(dateNameLayout)
func TimeToDateName(t time.Time) string {
return t.Format(dateNameLayout)
}
func DateNameToId(name string) (string, error) {
@ -43,5 +43,5 @@ func DateNameToId(name string) (string, error) {
if err != nil {
return "", err
}
return TimeToDateId(t), nil
return TimeToDateId(t, false), nil
}

View file

@ -1,42 +1,39 @@
package dateutil
import (
"fmt"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
)
func TestTimeToDateId(t *testing.T) {
assert.Equal(t, "_date_2024-11-07-12-25-59", TimeToDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
assert.Equal(t, "_date_1998-01-01-00-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
assert.Equal(t, "_date_1997-12-31-20-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60))))
assert.Equal(t, "_date_2124-12-25-23-34-00", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
assert.Equal(t, "_date_2124-12-26-01-34-00", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60))))
assert.Equal(t, "_date_2024-11-07-12-25-59Z_0000", TimeToDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC), true))
assert.Equal(t, "_date_1998-01-01-00-01-01Z_0000", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC), true))
assert.Equal(t, "_date_1998-01-01-00-01-01Z_0400", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)), true))
assert.Equal(t, "_date_2124-12-25-23-34-00Z_0000", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC), true))
assert.Equal(t, "_date_2124-12-25-23-34-00Z-0200", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)), true))
}
func TestTimeToShortDateId(t *testing.T) {
assert.Equal(t, "_date_2024-11-07", TimeToShortDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
assert.Equal(t, "_date_1998-01-01", TimeToShortDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
assert.Equal(t, "_date_1997-12-31", TimeToShortDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60))))
assert.Equal(t, "_date_2124-12-25", TimeToShortDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
assert.Equal(t, "_date_2124-12-26", TimeToShortDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60))))
assert.Equal(t, "_date_2024-11-07", TimeToDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC), false))
assert.Equal(t, "_date_1998-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC), false))
assert.Equal(t, "_date_1998-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)), false))
assert.Equal(t, "_date_2124-12-25", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC), false))
assert.Equal(t, "_date_2124-12-25", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)), false))
}
func TestTimeToDateName(t *testing.T) {
assert.Equal(t, "07 Nov 2024", TimeToDateName(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC), time.UTC))
assert.Equal(t, "01 Jan 1998", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC), time.UTC))
assert.Equal(t, "31 Dec 1997", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)), time.UTC))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC), time.UTC))
assert.Equal(t, "26 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)), time.UTC))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)), time.FixedZone("UTC", -2*60*60)))
assert.Equal(t, "07 Nov 2024", TimeToDateName(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
assert.Equal(t, "01 Jan 1998", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
assert.Equal(t, "01 Jan 1998", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60))))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60))))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60))))
}
func TestParseDateId(t *testing.T) {
t.Run("current date format", func(t *testing.T) {
t.Run("long date format", func(t *testing.T) {
for _, ts := range []time.Time{
time.Date(2024, time.December, 7, 12, 25, 59, 0, time.UTC),
time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
@ -45,20 +42,33 @@ func TestParseDateId(t *testing.T) {
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)),
} {
dateId := TimeToDateId(ts)
dateId := TimeToDateId(ts, true)
ts2, err := ParseDateId(dateId)
fmt.Println(ts, dateId, ts2)
assert.NoError(t, err)
assert.Equal(t, ts.Unix(), ts2.Unix())
}
})
t.Run("old date format", func(t *testing.T) {
ts := time.Date(2025, time.June, 8, 2, 25, 39, 0, time.UTC)
ts2, err := ParseDateId(addr.DatePrefix + ts.Format(shortDateIdLayout))
ts = ts.Truncate(24 * time.Hour)
assert.NoError(t, err)
assert.Equal(t, ts, ts2)
t.Run("short date format", func(t *testing.T) {
for _, ts := range []time.Time{
time.Date(2024, time.December, 7, 12, 25, 59, 0, time.UTC),
time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC),
time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)),
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)),
} {
dateId := TimeToDateId(ts, false)
ts2, err := ParseDateId(dateId)
assert.NoError(t, err)
assert.Equal(t, ts.Year(), ts2.Year())
assert.Equal(t, ts.Month(), ts2.Month())
assert.Equal(t, ts.Day(), ts2.Day())
assert.Zero(t, ts2.Hour())
assert.Zero(t, ts2.Minute())
assert.Zero(t, ts2.Second())
assert.Equal(t, time.Local, ts2.Location())
}
})
t.Run("wrong format", func(t *testing.T) {