Skip to content

The timezone argument is missing when instantiating from strings other than "now". #4746

@julienbornstein

Description

@julienbornstein

$date = new \DateTime($date);

Is there a reason not to pass the timezone as the second argument in that case (unlike previous cases) ? Timezone is set a few lines later but it's not wat we could expect

Let see with an exemple :

Right now it's

  • In Paris: 2026-01-22 it's 05:00 PM in Europe/Paris (+01:00)
  • In London: 2026-01-22 04:00 PM UTC
  • In Sydney: 2026-01-23 03:00 AM Australia/Sydney (+11:00) // Notice it's day +1

👉 php.ini timezone is set to UTC

Usage in Twig template

{{ "today"|date('Y-m-d', 'Australia/Sydney') }}

Current version result :

$today = new \DateTime("today"); // 2026-01-22 00:00:00.0 UTC (+00:00)
$today->setTimezone(new \DateTimeZone('Australia/Sydney')); // 2026-01-22 11:00:00.0 Australia/Sydney (+11:00)
echo $today->format('Y-m-d');
// output 2025-01-22 💥 

Expecting result

$today = new \DateTime("today", new \DateTimeZone('Australia/Sydney')); // 2026-01-23 00:00:00.0 Australia/Sydney (+11:00)
echo $today->format('Y-m-d');
// output 2025-01-23 👍 

False positive case

{{ "today"|date('Y-m-d', 'Europe/Paris') }}
$today = new \DateTime("today"); // today set time to 00:00:00 (https://www.php.net/manual/en/datetime.formats.php)
$today->setTimezone(new \DateTimeZone('Europe/Paris'));
echo $today->format('Y-m-d');
// output 2025-01-22

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions