2012-11-21 34 views
1

背景:我有一個系統,允許用戶創建待辦事項。目前,每12小時一個cron作業就會關閉,併發送提醒電子郵件。問題?不是每個用戶都在同一個時區,所以我的早上7點可以是他們的凌晨1點。PHP轉換時區提醒電子郵件

目標:允許用戶選擇他們自己的時區。此外,允許用戶選擇他們自己的首選時間,以15分鐘爲增量(選擇小時和00,15,30或45)。

我得到了:我在我的web應用程序上設置了一個變量來匹配電子郵件服務器的時區(-0600)。我允許用戶提交自己的時區和兩個首選的電子郵件時間。我正在編寫一個腳本,用於檢查當前時間是否與用戶的首選發送時間相匹配,並查看用戶的時區是否與系統的時區匹配。

背景,第二部分:當用戶提交他們的時區時,他們選擇他們的兩個首選時間(這三個信息都會被放到他們自己的數據庫中)。

我卡在哪裏: 我認爲最好的選擇是在用戶提交時將首選時間($ etime1和$ etime2)轉換爲系統的時區($ systz),所以它存儲在數據庫中系統的時區。這樣,計算是在用戶提交他們的偏好(不是很經常)時完成的,並不是每次執行cron作業(通常是每15分鐘一次)。用戶的時區在變量$ uzertz下。

所以:用戶提交的數據,這就是我有」

if ($usertz == $systz) { 
*submit the $etime1 and $etime2 data as-is*} 
else { *run some sort of script to convert $etime1 and $etime2 to the -0600 
(system's timezone) equivalent, after which is should be submitted to the db in it's 
converted version* } 

我瞭解PHP提供的方式,以時間從一個時區轉換爲另一種,但我一直有以下如何很難這些腳本的工作,特別是因爲一個人的,我發現在看系統時間,而不是用戶提交的時間。

謝謝!

+0

http://stackoverflow.com/a/11982744/149998 - 這應該會幫助你 - 忽略與特定應用程序有關的最後的東西。 – bcmcfc

+0

謝謝,我正在檢查它,看起來像你搖晃那個線程。 –

+0

靠近這個:http://stackoverflow.com/questions/7734678/convert-selected-time-and-timezone-to-a-set-timezone –

回答

2

在你應該總是使用GMT服務器,它是有一個唯一的方法一致的時間測量,例如在日光下想時間。順便說一句,轉換時間與其他時區,你可以使用DateTime

<?php 
$date = new DateTime($etime1, new DateTimeZone($usertz)); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

$date->setTimezone(new DateTimeZone($systz)); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 

您可以使用功能DateTimeZone::listIdentifiers()所有可用的時區列表。

例子:

<?php 
    // Server date/time 
    $etime1 = '2012-11-22 08:00:00'; 
    // Server timeZone 
    $date = new DateTime($etime1, new DateTimeZone('Asia/Jerusalem')); 

    // Converted date/time 
    $date->setTimezone(new DateTimeZone('America/Chicago')); 
    echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 

,輸出是:

2012-11-22 00:00:00-06:00 
+0

謝謝,喬萬尼。我試過上面的代碼。我的結果是$ etime1與時區差異列表。例如,$ etime1是08:00:00,它是08:00:00-0600。我能做些什麼來讓最終輸出實際計算並轉換時間? –

+0

也許我不明白。你需要沒有「-0600」的時間?只需從格式中刪除「P」:{$ date-> format('Y-m-d H:i:s')}。 –

+1

再次感謝。我的意思是:我住在以色列和上午8點的電子郵件。我要求系統在上午8點給我發送電子郵件($ etime1)。系統在上午8點發出電子郵件,但在自己的時區:芝加哥($ systz)。我在GMT +02:00(或UTC或亞洲/耶路撒冷,無論是$ usertz)。所以我需要系統採取我的上午8點,並將其轉換爲相當於芝加哥(這是上午12點 - 前一天午夜)。這樣系統將在$ systz 12:00 am發送電子郵件,它將在$ usertz上午8:00點擊我的收件箱。我試過你的代碼,它只是附加「-0600」,但沒有將08:00轉換成00:00。再次感謝! –

0

您可以使用PHP提供的DateTime對象5.

這使您可以提供一個DateTimeZone對象,當你創建你的DateTime。

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); 

您還可以動態更改時區。

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));