Make WordPress Core

Opened 5 years ago

Last modified 3 weeks ago

#48936 assigned enhancement

Remove mysql2date() usage from core

Reported by: rarst's profile Rarst Owned by: pbearne's profile pbearne
Milestone: Awaiting Review Priority: normal
Severity: normal Version:
Component: Date/Time Keywords: needs-patch needs-unit-tests
Focuses: Cc:

Description

mysql2date() was originally meant from processing times as stored by WP in database.

Unfortunately its design is very limited because both time zone of input and output is ambiguous. It is interchangeably used for local and UTC times.

As implementation detail that meant that it would produce incorrect output for formats including time zones for local time inputs. Time zone would happen be UTC from WP core setting PHP time zone to UTC on load.

In 5.3 release this behavior was flipped to produce correct local time output for local time input, as considerably more common. Accordingly now UTC input produces incorrect output for formats with time zone.

While the function is common and familiar, it is hardly irreplaceable and its design is so limited it seems to be unsalvageable.

I propose we move towards eliminating its use in core and eventually formally deprecating it.

Change History (4)

#1 @Rarst
5 years ago

  • Type changed from defect (bug) to enhancement

#2 @coquardcyr
2 years ago

Inside the core, we have the following usages from the function:

Version 1, edited 2 years ago by coquardcyr (previous) (next) (diff)

#3 @pbearne
6 weeks ago

  • Owner set to pbearne
  • Status changed from new to assigned

What should we replace this with?

#4 @sukhendu2002
3 weeks ago

I think we can use wp_date() for most cases. It handles timezones properly.

For displaying dates to users, we'd do something like:

$datetime = date_create($date_string, wp_timezone());
wp_date($format, $datetime->getTimestamp());

For UTC time outputs (like in feeds), gmdate() works well:

$timestamp = strtotime($date_string);
gmdate($format, $timestamp);

For comparing dates, it's cleaner to just create DateTime objects and compare them directly rather than converting to timestamps.

Note: See TracTickets for help on using tickets.