2012-11-30 66 views
4

這裏是我的代碼:Spring應用程序顯示服務器的時間,而不是客戶端時間

@RequestMapping(value="/test", method=RequestMethod.GET) 
public @ResponseBody String test(HttpServletRequest request) { 
    Calendar calendar = new GregorianCalendar(request.getLocale()); 
    String currentTime = calendar.getTime().toString(); 
    return"Current Time: " + currentTime; 
} 

這是我看這個時間:

Current Time: Fri Nov 30 22:45:42 UTC 2012 

我在中央時區,所以它應該是給我看這個:

Current Time: Fri Nov 30 14:45:42 CST 2012 

爲什麼我得到服務器時間而不是客戶端時間?

回答

4

您的代碼在服務器上執行,而不管您的客戶端位於何處。在服務器上,您將爲該機器設置時區,這將用於計算時間。當你撥打calendar.getTime()這個時區將被使用。

如果您想要客戶端時區,則需要發送它並使用SimpleDateFormat將服務器時間轉換爲客戶端時區。

3

這段代碼是正確的:

Calendar calendar = new GregorianCalendar(request.getLocale()); 

它基本上創建的Calendarin a一個實例:

優選區域設置客戶機將接受在內容的基礎上,Accept-Language頭

您的錯誤是將Calendar轉換爲Date這裏:

calendar.getTime() 

java.util.Date類是時區無關,總是它的默認toString()實現始終使用系統(您的服務器)時區。如果你想格式化客戶的時區當前服務器時間使用下面的代碼片段:

DateFormat df = DateFormat.getDateTimeInstance(
        DateFormat.LONG, 
        DateFormat.LONG, 
        request.getLocale() 
); 

df.format(new Date()); 

最後一點:這顯示時間使用的客戶端時區的服務器。這不是客戶端在瀏覽器(操作系統)中設置的時間。爲了弄清楚什麼是客戶端的時區,你需要在HTTP請求中顯式地發送客戶端的當前時間。

+0

這應該給我從我的時區的小時? Calendar calendar = new GregorianCalendar(request.getLocale()); int hour = calendar.get(Calendar.HOUR_OF_DAY); – user1007895

+0

@ user1007895:不,應該在瀏覽器時區返回當前小時,假設發送了「接受語言」 –

1

我建議讓控制器代碼返回UTC時間。然後在視圖層或者(更好的是)在客戶端瀏覽器上執行的JavaScript代碼轉換爲客戶端時間。

相關問題