2016-11-16 39 views
0

在Symfony/Angular項目中,我使用日期選擇器(Bootstrap datepicker)選擇日期。 這給了我一個對象的價值,然後我想發送到PHP被堅持。javascript to php date conversion in timezone。也許MySQL保存問題?

問題是有一個時間偏移給我在數據庫中的錯誤值。

我在法國設置,我已經在php.ini中定義了正確的時區。

  • 在日期選擇,我選擇:17/11/2016 這是在Thu Nov 17 2016 00:00:00 GMT+0100 (CET)
  • 翻譯,但是當我發送與Ajax調用PHP的:我有2016-11-16T23:00:00.000Z PHP端
  • 然後在我的數據庫教義,日期時間字段包含:2016-11-16 23:00:00
  • 當我想顯示回保存的值,它自然給datepicker:16/11/2016這實際上,如果我做的console.log():{"date":"2016-11-16 23:00:00.000000","timezone_type":3,"timezone":"Europe/Paris"}

我不在這個過程中使用的任何轉換。我確實嘗試「投射」js:start.toUTCString(),我也嘗試在php:$start.setTime(0, 0, 0);之後將時間設置爲0,但沒有成功。

那麼,我該如何保存並顯示正確的日期?

+0

請關注這部分'GMT + 0100',它的所有關於在服務器/客戶端 – JustOnUnderMillions

+1

簡短的回答時區? **別**。總是,*總是*在祖魯時間工作。時區是針對用戶的,而不是數據。如果您繪製任何其他課程,您將只會感受到痛苦。 –

+0

@JustOnUnderMillions:我想這樣,但那麼我怎麼能發送一個JS日期到PHP沒有時區問題? – Overdose

回答

0

這裏是我的建議:

每當你與時間戳工作使用epoch timestamp。 紀元時間戳記(unix時間戳記)從Jan 01st 1970開始,並以秒計算(對於大多數情況)。因此,例如今天會(2016年11月16日):

1479307079 seconds since Jan 01 1970. (UTC) 

現在,您可以將該值保存到數據庫或對象,您可以通過給JavaScript給予或回PHP從那裏該值來決定。

只要您處於JavaScript環境中,要顯示正確的時間,您可以並應該使用momentJS

爲什麼momentJS?

您不必擔心時區,momentJS是爲你做的工作:

moment().format();  // 2013-02-04T10:35:24-08:00 
moment.utc().format(); // 2013-02-04T18:35:24+00:00 

您可以分析UNIX時間戳(秒或毫秒)爲時刻的對象,並與他們的工作:

let day = moment.unix(1318781876); // will display only the day 

您可以將當前日期轉換爲紀元時間戳,因此您可以返回反向並保存用戶輸入的值,如datepicker。這裏是momentJS的文檔。


當心2038年的問題!

2038年問題是對於其中時間值存儲或計算爲有符號的32位整數計算和數據存儲的情況下的問題,並且因爲這個00:00數被解釋爲秒數:1970年1月1日世界標準時間(「世紀」)。 [...]

瞭解更多:https://en.wikipedia.org/wiki/Year_2038_problem

簡而言之:你是使用安全劃時代的時間戳,直到:

19th January 2038 03:14:07 UTC 

希望這有助於。

問候,Megajin