2016-02-12 30 views
0

我正在通過REST服務將Json數據發送給我的客戶端。此客戶端應該使用數據來顯示它。Json中的時區日期

我的客戶使用JavaScript。 我將通過以下方式日期:

var from = new Date(myJsonDate.match(/\d+/)[0] * 1); 

的JSON看起來是這樣的:

...="From":"\/Date(1450134000000)\/" ... 

我的問題是,日期是在德國正確的,但通過一天巴西(熄滅例如在巴西顯示週日而不是週一)。 此代碼是否使用時區並相應地計算出它? 我怎麼能把這個關掉? 我希望日期顯示完全如何發送。

+4

該值表示某個時刻 - 如果你想在一個特定的時區顯示的日期可能很容易成爲週一在德國和(同時)週日在巴西... –

+1

,只是做轉換客戶端上-側。我推薦使用時區轉換的簡單易用的moment.js。 – Ageonix

+0

這是一個[時代](https://en.wikipedia。org/wiki/Unix_time)的值?如果是這樣,那裏就沒有時區,那只是絕對的時間。您有責任將其投入任何您需要手動操作的當地時間。例如,使用[moment.js](http://momentjs.com/timezone/docs/)。 – tadman

回答

0

如果您在從服務器端發送日期時沒有對日期進行任何修改,日期將位於承載服務器的時區。

因此,如果您的服務器託管在德國,日期將在德國的時區。

將會有2種方法來解決這個問題:

  1. 在響應發送日期客戶端用戶的時區服務器。
  2. 在您的客戶端應用程序中進行調整以實現適當的 日期轉換。
+0

OP中的值只是一個時間值,它沒有時區。 – RobG

1

JavaScript中日期的操作具有時區變化,客戶機在該時區變化。

正確的機會不得不修復顯示日期之間的差異,因爲沒有人知道的功能。當您舉行日期時,回報她顯示爲:「Thu Feb 14 2008 08:41:27 GMT-0300(巴西的官方小時)」 請注意,在日期中具有GMT(格林尼治標準時間),表示在哪個時間區域的日期已配置。

我會盡量避免在日期操作中造成的時間差異。爲此,我們創建了一個函數,將日期始終轉換爲等待的時區。

var calculateTimeZone = function(date, offset) { 

    var miliseconds_with_utc = date.getTime() + (date.getTimezoneOffset() * 60000); 
    return new Date(miliseconds_with_utc + (3600000 * offset)); 

} 

注意的是,在第3行,我們調用方法的getTime()在該日期的地方瞬間轉換爲通過自1970年1月1日(Unix紀元)毫秒爲代表的一批。我們通過JavaScript中的日期方法geTimezoneOffset()獲取當前時區,並在瀏覽器中設置當前時區,並乘以一個小時的毫秒數。我們再添加這兩個值。

爲什麼一個小時?

爲什麼這是表示每個時區的時間。默認情況下,此方法在幾分鐘內返回此時區,此時需要小時轉換。 爲了到達這個號碼60000你有記得1秒有1000毫秒和1分鐘有60秒,然後轉換分鐘,我們乘60 * 1000 = 60000

這個時刻,我們有UTC(協調毫秒世界時間)由變量「utc」以當地時間的總和表示,以毫秒爲單位的時區。 現在我們需要得到一個日期,開始這個UTC加上命運的時區,例如在巴西時區(巴西小時)的時區+5變換中如何表示日期。

請注意,在第5行中,我們得到了小時的偏移量(時區表示)並轉換爲毫秒。請記住,這裏1秒有1000毫秒和其中1個小時有3600秒,然後將其轉換以毫秒爲單位小時應乘以1000 * 3600 = 3600000

我們加入這個結果與變量「UTC」的值,我們得到了瞬間到想要的時區。因此,我們創建一個新的日期與長期合適的基礎上,並返回這個新的日期。

通過這種方式,當我們需要在正確的時區表示日期時,我們可以保持應用程序所需的完整性。

+1

並非所有時區偏移都是1小時的整數倍數。有些有半個小時,有的有四分之一,請參閱[*維基百科:UTC時間偏移列表*](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets)。你的解釋過於複雜。要將任何日期調整爲另一個時區偏移量,請確定兩個偏移量之間的差異並應用它。 – RobG

1

此代碼是否使用的時區,並計算相應的這個?

否。將一個數字傳遞給Date constructor被解釋爲一個時間值,即自1970-01-01T00:00:00Z以來的毫秒數。無論客戶端的設置如何,它都會創建一個完全相同時間的日期。

然而,在默認情況下,Date.prototype.toString使用主機系統設置,應用偏移到顯示值作爲「本地」的時間。

我怎麼能關閉這個功能?

修改腳本引擎。它是ECMAScript標準的一部分,所以任何不這樣做的實現都不符合標準。

我希望日期顯示完全如何發送它。

或者:

  1. 將其作爲一個普通的字符串,而不是作爲一個日期
  2. 同時發送的時區源的偏移,因此您可以在另一端應用它,以保留日期一樣。

ECMAScript的偏移具有相反意義的大多數標準,他們-ve東部和+已經爲西,所以要得到當地設置的日期具有相同源系統:

var d = new Date(timevalue); 
d.setMinutes(d.getMinutes() + d.getTimezoneOffset() - sourceTimezoneOffset); 

sourceTimezoneOffset是偏離的分鐘數源系統的,陽離子西部和-ve東。

日期通常與特定的時間段,從而指出的那樣,在一個地方的日期可能是在同一時刻在另一個地方的日期不同。

+0

作爲附錄,不要根據位置硬編碼時區偏移。這不會考慮夏令時。相反,使用Date對象通過Date.prototype.getTimezoneOffset() – mienaikoe

+0

@ mienaikoe給你的偏移量 - 也許你的註釋是針對OP的? – RobG