DateInterval issues with negative directions
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.2k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
I am going to put a few connected issues I have noticed around DateInterval and DatePeriod into a single report:
1: DateInterval->invert is "readonly"
DateInterval:::__construct() only allows positive $duration e.g. P1D not P-1D (I appreciate this is the correct behaviour as it is based around the ISO8601 which has no concept of negative periods). However... the DateInterval->invert which allows the period to be reversed can only be changed by manually setting that property and the docs explicitly say:
The available properties listed below depend on PHP version, and should be considered as readonly.
It would be good to be able to change this property safely.
2: DateInterval::createFromDateString allows negative periods
DateInterval::createFromDateString('-1 day') is accepted but this sets DateInterval->d = -1 rather than using the ::invert property. This is inconsistent with the always-positive periods which __construct allows.
I would expect it to:
- Reject mixed positive and negative period values, what would
+1 year -6 montheven mean? - Accept if only negative periods passed but then set
::invert = 1and the properties of::y..fas+ve
3: DateInterval::createFromDateString('-1 day') leads to infinite loop in DatePeriod
$datePeriod = new \DatePeriod(
new \DateTimeImmutable('2000-01-01'),
\DateInterval::createFromDateString('-1 day'),
new \DateTimeImmutable('2000-01-05'),
);
echo iterator_count($datePeriod); // stuck in infinite loop
4: DateInterval::createFromDateString('-1 day') still doesn't work if start and end reversed in DatePeriod
$datePeriod = new \DatePeriod(
new \DateTimeImmutable('2000-01-05'),
\DateInterval::createFromDateString('-1 day'),
new \DateTimeImmutable('2000-01-01'),
);
echo iterator_count($datePeriod); // 0 (but would expect 4)
5: DatePeriod doesn't respect DateInterval->invert
$dateInterval = new \DateInterval('P1D');
$dateInterval->invert = 1;
# will not go backwards from high to low dates
$datePeriod = new \DatePeriod(
new \DateTimeImmutable('2000-01-05'),
$dateInterval,
new \DateTimeImmutable('2000-01-01'),
);
echo iterator_count($datePeriod); // 0 (but would expect 4)
# incorrectly goes forward from low to high dates
$datePeriod = new \DatePeriod(
new \DateTimeImmutable('2000-01-01'),
$dateInterval,
new \DateTimeImmutable('2000-01-05'),
);
echo iterator_count($datePeriod); // 4 (but would expect 0)
PHP Version
8.3.114
Operating System
Rocky 8
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza reproduciendo los ejemplos mediante los puntos de entrada DateInterval y DatePeriod, incluidos los intervalos negativos, las fechas invertidas y la propiedad invert. Revisa el comportamiento existente de los periodos de fechas y decide una semántica coherente para las direcciones negativas, los signos mixtos y los intervalos invertidos. Se considerará terminado cuando los casos informados tengan un comportamiento definido que no entre en bucles y cobertura de regresión.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100