簡體   English   中英

PHP日光節約難題

[英]PHP Daylight savings conundrum

我有一個關於夏時制的一般問題。 我猜它並不是真的特定於PHP,但是我正在用PHP編寫,因此我認為包含它不會有什么壞處。

我有一個使用jQuery fullcalendar構建的日歷應用程序。 用戶在本地時區查看事件,我的服務器將事件存儲為mysql中的UTC日期時間。 (有關stackoverflow的其他問題表明,這是處理時區的最佳方法。)因此,每次用戶在日歷上保存或查看事件時都會進行一次轉換。 這工作正常,但是我對如何最好地解決夏時制感到困惑。

例如,假設時區EST(東部標准時間)的用戶在每天下午3點不是夏令時時創建一個事件。 我的PHP代碼使用標准的DateTime(和DateTimeZone)類通過UTC-5:00在UTC和EST之間進行轉換。 如果啟用了夏令時,時鍾將提前一小時,而PHP將在UTC-4:00之前在UTC和EST之間轉換。 從用戶的角度來看,該事件然后從原始的下午3點轉移到下午4點。 這不是我和用戶想要的。 無論夏令時如何,下午3點的活動應保持下午3點的活動。 處理此問題的最佳方法是什么? PHP中有沒有辦法忽略夏時制?

我的代碼:

$getDate = new DateTime($storedDate, new DateTimeZone('UTC'));
$getDate->setTimezone(new DateTimeZone('America/New_York'));
$getDateString = $getDate->format('Y-m-d H:i:s');

更多信息:(摘自下面的評論)

-僅存儲第一次出現的重復事件。 所有其他事件都是根據用戶請求的日歷視圖(月,周或日視圖)動態創建的。 用我編碼的方式,它僅創建將在視圖上可見的事件。

-事實是,我還需要在其他時區保持不變。 繼續原始示例,下午3點應保持在美國東部標准時間下午3點(不考慮夏令時),但是如果在中部時間查看事件,則事件也應保持下午2點(不考慮夏令時)。

本質上,我需要以某種方式忽略夏時制。

這是一個復雜的問題。 我已經了解到並非每天都有86,400秒長的艱難方法。

在處理各種日歷應用程序時,我很早就做出了設計決定,這使我省去了很多麻煩。 也就是說,事件的每個實例在數據庫中都有一個條目。

一個表包含所有事件信息(標題,描述等)。 另一個表為該事件的每個實例保存了一個時間戳。 當有人預定了重復事件(比如3:00 PM逢星期三),我將在下午3:00 在他們的時區每星期三(這實際上是存儲為UTC)插入一個實例。 現在,理論上的事件可以永遠重復。 我認為,對重復設置合理的限制(例如50或100年)要比計算活動中所有事件的日期要容易得多。 對用戶而言,事件似乎永遠持續下去,但在數據庫中卻沒有。 即使您每天安排100年的活動,在一個非常狹窄的表中也只有36,500條記錄。

使用這種方法,您必須考慮例外。 有時人們會更改一個事件實例的詳細信息。 在這些情況下,我只是創建了另一個事件並復制了相關的詳細信息……因為它實際上是一個單獨的事件。 如果您想將它們與組ID綁定在一起,則可以。 更改事件的單獨計划很容易,因為每個實例都有單獨的一行。

對於這種情況,我建議使用這種方法。 它使我能夠依靠數據庫來完成所有繁重的工作,這為我節省了很多麻煩,並且同時解決了您的時區問題。

您是否嘗試過查看DateTimeZone :: getTransitions()?

http://www.php.net/manual/en/datetimezone.gettransitions.php

特別要使用[offset]和[isdst]屬性。

  • 當他們節省時間時,請在當前日期之前找到不是DST的第一個轉換。 (通常是過去一年中的兩個值之一)。 使用非DST周期的偏移量進行轉換
  • 檢索值並且您當前處於DST周期時,請使用非DST周期的偏移量轉換時間,而不是當前偏移量。

以EST為例,即使在8月,即使在EDT中,也使用-5的EST轉換保存值。

如果撤回該值(如果他們在1月查看該值),則添加5;如果在8月,則添加4。

在假設開關一致的情況下,這將適用於95%的情況。 如果Eastern決定與Central合並,則可能會有運行–5 / –4 / –5 / –4 / –5 / –5 / –6 / –5 / –6 / –6的過渡,這會使事情變得混亂。

這沒有萬能的子彈。 我不知道您的應用程序結構的詳細信息,您可能只需要嘗試在每天的午夜增加3個小時,以便將任何重復的日常約會僅存儲為時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM