Skip to content

Incorrect session expiration time while winter/daylight saving time changes #244

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
forrest79 opened this issue Apr 1, 2025 · 5 comments

Comments

@forrest79
Copy link
Contributor

Version: 3.3.2

Bug Description

In DI we had set:

session:
    expiration: '+75 minutes' 

During last winter to daylight saving time change, we encounter this error in log PHP User Notice: The expiration time is greater than the session expiration 900 seconds in .../vendor/nette/http/src/Http/SessionSection.php:197.

This error appears at 01:45 (30.3.2025) and the last was at 01:59. Our setting is 75 minutes = 4500 second. Minus one hour, it is 900 seconds (from the error message). The error started 75 minutes before 3:00 and ended at 2:00 when the time was changed to 3:00.

I think the problem is in the vendor/nette/http/src/Http/Session.php -> setExpiration method.

$expire = Nette\Utils\DateTime::from($expire)->format('U') - time()

DateTime is handling correctly time change, but time() doesn't. For now, we try to fix this by setting expiration: '4500' that is in Nette\Utils\DateTime::from() used as numeric and is not converted via PHP DateTime.

Steps To Reproduce

Not sure how to simply simulate this without changing computer date/time.

Expected Behavior

I'm expecting correct expiration time during winter/daylight saving time change.

Possible Solution

Not sure.

@dg
Copy link
Member

dg commented Apr 1, 2025

I can remove the check completely.

@forrest79
Copy link
Contributor Author

Ok, but it doesn't solve, that expiration should be all the time 4500 seconds, but for 15 minutes it was only 900 seconds, right?

@JanTvrdik
Copy link
Contributor

Another option would be to ignore the timezone configuration in PHP and compute the expiration always in UTC. Sth like

$nowUtc = new DateTimeImmutable('now', new DateTimeZone('UTC'));
$expireInSeconds = $nowUtc->modify($expire)->getTimestamp() - $nowUtc->getTimestamp();

@dg
Copy link
Member

dg commented Apr 3, 2025

@JanTvrdik I don't think that timezone would have any influence in your example

Edit: tývolé, vůbec jsem netušil, že je v těch relativních časech taková prasárnička, žiju celý život v iluzi 🙈

@dg
Copy link
Member

dg commented Apr 4, 2025

I think I'll fix Nette\Utils\DateTime to handle relative times more sanely.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants