diff --git a/src/DonorDashboards/Profile.php b/src/DonorDashboards/Profile.php index d0c2969819..93e2dac6cc 100644 --- a/src/DonorDashboards/Profile.php +++ b/src/DonorDashboards/Profile.php @@ -11,6 +11,7 @@ use Give\DonorDashboards\Pipeline\Stages\UpdateDonorAvatar; use Give\DonorDashboards\Pipeline\Stages\UpdateDonorCompany; use Give\Donors\Models\Donor; +use Give\Framework\Support\Facades\DateTime\Temporal; /** * @since 2.10.0 @@ -79,6 +80,7 @@ public function update($data) /** * Return array of donor profile data * + * @unreleased Replace strtotime() with Temporal::getDateTimestamp() to prevent the use of dates with wrong timezones * @since 2.10.0 * * @return array @@ -97,11 +99,11 @@ public function getProfileData() 'lastName' => $this->donor->get_last_name(), 'emails' => $this->donor->emails, 'sinceLastDonation' => ! empty($this->donor->get_last_donation_date()) ? human_time_diff( - strtotime($this->donor->get_last_donation_date()) + Temporal::getDateTimestamp($this->donor->get_last_donation_date()) ) : '', 'avatarUrl' => $this->getAvatarUrl(), 'avatarId' => $this->getAvatarId(), - 'sinceCreated' => human_time_diff(strtotime($this->donor->date_created)), + 'sinceCreated' => human_time_diff(Temporal::getDateTimestamp($this->donor->date_created)), 'company' => $this->donor->get_company_name(), 'initials' => $this->donor->get_donor_initals(), 'titlePrefix' => $this->getTitlePrefix(), diff --git a/src/Framework/Support/Facades/DateTime/Temporal.php b/src/Framework/Support/Facades/DateTime/Temporal.php index 4281425e0f..24c3c6376f 100644 --- a/src/Framework/Support/Facades/DateTime/Temporal.php +++ b/src/Framework/Support/Facades/DateTime/Temporal.php @@ -2,7 +2,6 @@ namespace Give\Framework\Support\Facades\DateTime; -use DateTime; use DateTimeInterface; use Give\Framework\Support\Facades\Facade; @@ -14,6 +13,7 @@ * @method static string getFormattedDateTime(DateTimeInterface $dateTime) * @method static string getCurrentFormattedDateForDatabase() * @method static DateTimeInterface withoutMicroseconds(DateTimeInterface $dateTime) + * @method static int getDateTimestamp(string $date, string $timezone = '') */ class Temporal extends Facade { diff --git a/src/Framework/Support/Facades/DateTime/TemporalFacade.php b/src/Framework/Support/Facades/DateTime/TemporalFacade.php index 8a277975cd..c41dd54bc8 100644 --- a/src/Framework/Support/Facades/DateTime/TemporalFacade.php +++ b/src/Framework/Support/Facades/DateTime/TemporalFacade.php @@ -5,6 +5,9 @@ use DateTime; use DateTimeImmutable; use DateTimeInterface; +use DateTimeZone; +use Exception; +use Give\Log\Log; /** * @since 2.19.6 @@ -76,4 +79,29 @@ public function withoutMicroseconds(DateTimeInterface $dateTime) return $newDateTime; } + + /** + * @unreleased + */ + public function getDateTimestamp(string $date, string $timezone = ''): int + { + try { + $timezone = empty($timezone) ? wp_timezone_string() : $timezone; + $timezone = new DateTimeZone($timezone); + $date = new DateTime($date, $timezone); + + return $date->getTimestamp(); + } catch (Exception $e) { + Log::error( + 'Failed to parse date string into a timestamp', + [ + 'input_date' => $date, + 'input_timezone' => $timezone, + 'error_code' => $e->getCode(), + 'error_message' => $e->getMessage(), + ] + ); + return 0; + } + } }