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:
parent
d7e016d50d
commit
e0acfc4f55
14 changed files with 100 additions and 76 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue