2016-01-03 64 views
2

返回錯誤的日期在我的PHP應用程序,我設置了意大利時區像這樣:Momentjs分鐘後操縱

date_default_timezone_set('Europe/Rome'); 

上面的字符串位於我config.php文件,應用程序的核心。無論如何,從後端我使用momentjsCodeIgniter框架。當用戶從正確輸入集選擇日期這樣的結果:

enter image description here

現在我得到這個輸入值是這樣的:

var end_date_temp = Date.parse($('#end-datetime').val()); 

而且最初的結果是錯誤的:

星期二2016年3月1日11時03分00秒GMT + 0100(ORA SOLARE歐洲西的)

的代碼的其餘部分是:

var end_date = moment(end_date_temp).add(serviceDuration, 'minutes').format('DD/MM/YYYY HH:mm'); 
$('#end-datetime').val(end_date); 

注:我也試着設置moment.locale('it')但同樣的結果出現,在我的JavaScript庫我已經momentjs意大利時區。哪裏不對?

更新代碼:

var end_date_temp = moment($('#end-datetime').val())._i; 
var end_date = moment(moment(end_date_temp).add(serviceDuration, 'minutes')).format('DD/MM/YYYY HH:mm'); 
$('#end-datetime').val(end_date); 
+0

*不*使用'_i'場,也不其他任何帶有_ _前綴的字段。它們不適用於外部消費。 –

回答

2
// parse the input string to a moment object, **specifying the input format** 
var end_date = moment($('#end-datetime').val(), 'DD/MM/YYYY HH:mm'); 

// manipulate it as desired 
end_date.add(serviceDuration, 'minutes'); 

// format it to the specified output format, and assign the result back to your field 
$('#end-datetime').val(end_date.format('DD/MM/YYYY HH:mm')); 

如果你喜歡,你可以在一行代碼中做到這一點。

$('#end-datetime').val(moment($('#end-datetime').val(), 'DD/MM/YYYY HH:mm').add(serviceDuration, 'minutes').format('DD/MM/YYYY HH:mm')); 

區域設置不符合的代碼特定位很重要,因爲你不使用任何語言環境特定的功能或格式說明

+0

偉大的解決方案馬特,現在我感覺像開發生命的最後一張圖片: http://martinvalasek.com/blog/pictures-from-a-developers-life-part-2 祝你有美好的一天,新年快樂! – Dillinger

+0

謝謝。你也是! –

+0

@Dillinger所以我張貼完全一樣的東西不嚼你,這不是一個有效的答案? – Shanoor

0

momentjs使用美國日期格式(MM/DD/YYYY),強制執行的格式,以獲得正確的日期:

var input = '03/01/2016 11:00'; 
 
var date = moment(input, 'DD/MM/YYYY HH:mm'); 
 

 
document.write(date);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.0/moment.min.js"></script>

+0

我已經使用.format('DD/MM/YYYY hh:mm');但最終的日期是不正確的,因爲我上面解釋過。 – Dillinger

+0

'format()'用於返回日期作爲字符串。要正確解析輸入,必須將該格式作爲「moment()」的第二個參數。 – Shanoor

0

經過很多次嘗試之後,我在我的時區(意大利語)中修復如下所示:

moment.locale('it'); 

var end_date_temp = moment($('#end-datetime').val()).format('DD/MM/YYYY HH:mm') 
var end_date = moment(end_date_temp).add(30, 'minutes'); 
$('#end-datetime').val(moment(moment(end_date).toDate()).format('DD/MM/YYYY HH:mm')); 

我宣佈.localeit,下一次我在我的時區格式化了輸入文本返回的時間。我已經使用.add方法操縱日期,爲此,我創建了另一個momentjs對象實例。最後,我傳遞輸入的值,再次以我的時區格式重新格式化日期,因爲在操作中我失去了以前的格式。最終的結果是我想要的。無論如何,如果有人找到比我更樂意看到的優化解決方案,希望這種幫助。

+2

您仍然會將輸入格式與輸出格式混淆,並且不必要地多次解析/轉換。我將在單獨的答案中發佈更好的版本。 –

+0

[看我的答案是正確的實現。](http://stackoverflow.com/questions/34575111/momentjs-return-wrong-date-after-minutes-manipulation/34580386#34580386) –