fix(filter): check date boundary after timezone conversion

Resolves https://github.com/go-vikunja/vikunja/issues/1605
This commit is contained in:
kolaente 2025-10-07 10:55:13 +02:00
parent 49e6d73a11
commit 1b02f78eee
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
1 changed files with 12 additions and 7 deletions

View File

@ -89,9 +89,14 @@ func parseTimeFromUserInput(timeString string, loc *time.Location) (value time.T
return value, err
}
value = time.Date(year, time.Month(month), day, 0, 0, 0, 0, loc)
return value.In(config.GetTimeZone()), nil
}
return value.In(config.GetTimeZone()), err
value = value.In(config.GetTimeZone())
// Mysql/Mariadb does not support date values where the year < 1. To make this edge-case work,
// we're setting the year to 1 in that case. This must be done after timezone conversion.
if db.GetDialect() == builder.MYSQL && value.Year() < 1 {
value = value.AddDate(1-value.Year(), 0, 0)
}
return value, err
}
func parseFilterFromExpression(f fexpr.ExprGroup, loc *time.Location) (filter *taskFilter, err error) {
@ -292,17 +297,17 @@ func getValueForField(field reflect.StructField, rawValue string, loc *time.Loca
t, err = datemath.Parse(rawValue)
if err == nil {
tt = t.Time(datemath.WithLocation(loc)).In(config.GetTimeZone())
// Mysql/Mariadb does not support date values where the year < 1. To make this edge-case work,
// we're setting the year to 1 in that case. This must be done after timezone conversion.
if db.GetDialect() == builder.MYSQL && tt.Year() < 1 {
tt = tt.AddDate(1-tt.Year(), 0, 0)
}
} else {
tt, err = parseTimeFromUserInput(rawValue, loc)
}
if err != nil {
return
}
// Mysql/Mariadb does not support date values where the year < 1. To make this edge-case work,
// we're setting the year to 1 in that case.
if db.GetDialect() == builder.MYSQL && tt.Year() < 1 {
tt = tt.AddDate(1-tt.Year(), 0, 0)
}
value = tt
}
case reflect.Slice: