@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 91 lines 2.4 kB view raw
1<?php 2 3final class PhabricatorTime extends Phobject { 4 5 private static $stack = array(); 6 private static $originalZone; 7 8 public static function pushTime($epoch, $timezone) { 9 if (empty(self::$stack)) { 10 self::$originalZone = date_default_timezone_get(); 11 } 12 13 $ok = date_default_timezone_set($timezone); 14 if (!$ok) { 15 throw new Exception(pht("Invalid timezone '%s'!", $timezone)); 16 } 17 18 self::$stack[] = array( 19 'epoch' => $epoch, 20 'timezone' => $timezone, 21 ); 22 23 return new PhabricatorTimeGuard(last_key(self::$stack)); 24 } 25 26 public static function popTime($key) { 27 if ($key !== last_key(self::$stack)) { 28 throw new Exception( 29 pht( 30 '%s with bad key.', 31 __METHOD__)); 32 } 33 array_pop(self::$stack); 34 35 if (empty(self::$stack)) { 36 date_default_timezone_set(self::$originalZone); 37 } else { 38 $frame = end(self::$stack); 39 date_default_timezone_set($frame['timezone']); 40 } 41 } 42 43 public static function getNow() { 44 if (self::$stack) { 45 $frame = end(self::$stack); 46 return $frame['epoch']; 47 } 48 return time(); 49 } 50 51 public static function parseLocalTime($time, PhabricatorUser $user) { 52 $old_zone = date_default_timezone_get(); 53 54 date_default_timezone_set($user->getTimezoneIdentifier()); 55 $timestamp = (int)strtotime($time, self::getNow()); 56 if ($timestamp <= 0) { 57 $timestamp = null; 58 } 59 date_default_timezone_set($old_zone); 60 61 return $timestamp; 62 } 63 64 public static function getTodayMidnightDateTime($viewer) { 65 $timezone = new DateTimeZone($viewer->getTimezoneIdentifier()); 66 $today = new DateTime('@'.time()); 67 $today->setTimezone($timezone); 68 $year = $today->format('Y'); 69 $month = $today->format('m'); 70 $day = $today->format('d'); 71 $today = new DateTime("{$year}-{$month}-{$day}", $timezone); 72 return $today; 73 } 74 75 public static function getDateTimeFromEpoch($epoch, PhabricatorUser $viewer) { 76 $datetime = new DateTime('@'.$epoch); 77 $datetime->setTimezone($viewer->getTimeZone()); 78 return $datetime; 79 } 80 81 public static function getTimezoneDisplayName($raw_identifier) { 82 83 // Internal identifiers have names like "America/Los_Angeles", but this is 84 // just an implementation detail and we can render them in a more human 85 // readable format with spaces. 86 $name = str_replace('_', ' ', $raw_identifier); 87 88 return $name; 89 } 90 91}