2014-09-04 16 views
3

我在JavaScript中有個約會對象,去如下:正確的客戶端(JavaScript的)和服務器(PHP)之間的格式倍

var date = 2014-12-01T00:00:00.000Z 

如果我做的:

var date = new Date(date); 
date.setUTCMonth(date.getUTCMonth()+1); 

然後toISOString()方法顯示預期值:

2015-01-01T00:00:00.000Z

但是,當我發送日期時間字符串通過張貼到PHP腳本,並使用該DateTime類解析回一個日期,我得到這個:

2014-12-31 19:00:00 -0500

我已經嘗試設置使用DateTimeZone類的時區,並沒有運氣的時區設置爲我自己和UTC:

new DateTime($_POST['DateTime'],new DateTimeZone('America/Mexico_City')); 
new DateTime($_POST['DateTime'],new DateTimeZone('UTC')); 

有沒有辦法在JavaScript設置時區,使用Date類?有其他解決方法嗎?所有處理時區的經驗都很小,如果不是零。

更新

這裏是我的ISO格式的時間字符串作爲每toISOString()方法(JavaScript的):

2014-09-01T00:00:00.000Z

這裏是我的$_POST var的內容根據print_r()

Array (
    [DateTime] => 2014-09-01T00:00:00.000Z 
) 

這是我的格式化函數的輸出,使用'%c'格式(es_MX區域):

DOM 31年前2014 19:00:00 CDT

並且所提到的格式化功能:

function formatDate($date) { 
    return utf8_encode(strftime('%c', $date->getTimestamp())); 
} 

回答

1

我認爲當你發送日期字符串,它以某種方式以不同的格式。至少當我測試這個時,它按預期工作:

$a = new DateTime('2015-01-01T00:00:00.000Z'); 
echo $a->format('Y-m-d H:i:s'); // Outputs '2015-01-01 00:00:00'

Demo here

1

你所得到的問題是,當你使用以下格式

$date = '2015-01-01T00:00:00.000Z'; 

您指定一個時區。

公告的「ž」在你的約會結束時,使用它是「nautical timezone (GMT)

相當於因此,當您嘗試運行這段代碼,你會得到這是不完全相同的日期即使您已指定DateTimeZone作爲構造函數參數,您還是期待什麼。

$dateTime = new DateTime($date, new DateTimeZone('America/Mexico_City')); 
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00+00:00 

$dateTime = new DateTime($date, new DateTimeZone('UTC')); 
echo $dateTime->format('c'). "\n"; //2015-01-01T00:00:00+00:00 

這是預期的PHP行爲和$timezone參數下的DateTime::__constructdocumentation被記載:

注:

在$時區參數和當前時區都將被忽略,當 $時間參數是UNIX時間戳(例如@ 946684800)或 指定時區(例如2010-01-28T15:00:00 + 02:00)。

在你的情況,你直接在你的日期(「ž」)指定一個時區,這就是爲什麼DateTimeZone對象被忽略。

爲了避免這種情況,並設置一個自定義的時間段將它設置在日期時間字符串或擺脫在Z:

$date = '2015-01-01T00:00:00.000'; 
$dateTime = new DateTime($date, new DateTimeZone('America/Mexico_City')); 
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00-06:00 

$dateTime = new DateTime($date, new DateTimeZone('UTC')); 
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00+00:00 

$date = '2015-01-01T00:00:00.000 America/Mexico_City'; 
$dateTime = new DateTime($date); 
echo $dateTime->format('c'). "\n"; //2015-01-01T00:00:00-06:00 

的查看代碼的不同版本的PHP在這裏工作:Demo

而且看看此相關的問題,我問最近:PHP DateTime Timezones - Constructor vs Setter method

+0

的問題不在於我得到的Z區的時間,而是-0500時間和我想的Z區的時間。 – arielnmz 2014-09-04 16:31:13

+0

你能指定你從'$ _POST ['DateTime']'得到什麼嗎? – Onema 2014-09-04 17:13:21

+0

另外看看這裏提供的代碼中的輸出:http://3v4l.org/0dTRW。如果你沒有得到一個時區,你應該只使用新的DateTimeZone('UTC')'在CONSTRUCTOR中,而不使用'DateTime :: setTimezone()'方法,因爲你會得到不同的結果,請參閱:http:// 3v4l.org/8Zd1Y。在構造函數中,它只會更改時區,在該方法中它將更改時間(h:m)和時區,以在不同時區中表示對象當前日期 - 時間。請參閱相關問題:http://stackoverflow.com/questions/25658539/php-datetime-timezones-constructor-vs-setter-method – Onema 2014-09-04 17:28:20

相關問題