@@ -259,8 +259,8 @@ type EvalOptions struct {
259259 FirstDay int
260260 FirstMonth int
261261
262- ref time.Time
263- truncatedRef bool
262+ ref time.Time
263+ largestSnappedGrain timeutil. TimeGrain
264264}
265265
266266func Parse (from string , parseOpts ParseOptions ) (* Expression , error ) {
@@ -347,9 +347,7 @@ func (e *Expression) Eval(evalOpts EvalOptions) (time.Time, time.Time, timeutil.
347347 i := len (e .AnchorOverrides ) - 1
348348 for i >= 0 {
349349 evalOpts .ref , _ = e .AnchorOverrides [i ].eval (evalOpts , evalOpts .ref , e .tz )
350- if e .AnchorOverrides [i ].truncates () {
351- evalOpts .truncatedRef = true
352- }
350+ evalOpts .largestSnappedGrain = max (evalOpts .largestSnappedGrain , e .AnchorOverrides [i ].largestSnappedGrain ())
353351 i --
354352 }
355353
@@ -487,9 +485,10 @@ func (o *OrdinalInterval) eval(evalOpts EvalOptions, start time.Time, tz *time.L
487485 return start , end , tg
488486 }
489487
490- if ! evalOpts .truncatedRef {
491- tg = grainMap [o .Ordinals [len (o .Ordinals )- 1 ].Grain ]
492- start = truncateWithCorrection (start , higherOrderMap [tg ], tz , evalOpts .FirstDay , evalOpts .FirstMonth )
488+ lastTg := grainMap [o .Ordinals [len (o .Ordinals )- 1 ].Grain ]
489+ if lastTg > evalOpts .largestSnappedGrain {
490+ tg = lastTg
491+ start = truncateWithCorrection (start , higherOrderMap [lastTg ], tz , evalOpts .FirstDay , evalOpts .FirstMonth )
493492 }
494493
495494 i := len (o .Ordinals ) - 1
@@ -577,8 +576,19 @@ func (p *PointInTime) eval(evalOpts EvalOptions, tm time.Time, tz *time.Location
577576 return tm , tg
578577}
579578
580- func (p * PointInTime ) truncates () bool {
581- return len (p .Points ) > 0 && p .Points [len (p .Points )- 1 ].Snap != nil
579+ func (p * PointInTime ) largestSnappedGrain () timeutil.TimeGrain {
580+ largest := timeutil .TimeGrainUnspecified
581+ for _ , point := range p .Points {
582+ if point .Snap == nil {
583+ continue
584+ }
585+
586+ tg := grainMap [* point .Snap ]
587+ if tg > largest {
588+ largest = tg
589+ }
590+ }
591+ return largest
582592}
583593
584594func (p * PointInTimeWithSnap ) parse () error {
0 commit comments