TimeZone.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheet\Shared;
  3. use DateTimeZone;
  4. use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
  5. class TimeZone
  6. {
  7. /**
  8. * Default Timezone used for date/time conversions.
  9. *
  10. * @var string
  11. */
  12. protected static $timezone = 'UTC';
  13. /**
  14. * Validate a Timezone name.
  15. *
  16. * @param string $timezone Time zone (e.g. 'Europe/London')
  17. *
  18. * @return bool Success or failure
  19. */
  20. private static function validateTimeZone($timezone)
  21. {
  22. return in_array($timezone, DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC));
  23. }
  24. /**
  25. * Set the Default Timezone used for date/time conversions.
  26. *
  27. * @param string $timezone Time zone (e.g. 'Europe/London')
  28. *
  29. * @return bool Success or failure
  30. */
  31. public static function setTimeZone($timezone)
  32. {
  33. if (self::validateTimezone($timezone)) {
  34. self::$timezone = $timezone;
  35. return true;
  36. }
  37. return false;
  38. }
  39. /**
  40. * Return the Default Timezone used for date/time conversions.
  41. *
  42. * @return string Timezone (e.g. 'Europe/London')
  43. */
  44. public static function getTimeZone()
  45. {
  46. return self::$timezone;
  47. }
  48. /**
  49. * Return the Timezone offset used for date/time conversions to/from UST
  50. * This requires both the timezone and the calculated date/time to allow for local DST.
  51. *
  52. * @param ?string $timezone The timezone for finding the adjustment to UST
  53. * @param float|int $timestamp PHP date/time value
  54. *
  55. * @return int Number of seconds for timezone adjustment
  56. */
  57. public static function getTimeZoneAdjustment($timezone, $timestamp)
  58. {
  59. $timezone = $timezone ?? self::$timezone;
  60. $dtobj = Date::dateTimeFromTimestamp("$timestamp");
  61. if (!self::validateTimezone($timezone)) {
  62. throw new PhpSpreadsheetException("Invalid timezone $timezone");
  63. }
  64. $dtobj->setTimeZone(new DateTimeZone($timezone));
  65. return $dtobj->getOffset();
  66. }
  67. }