簡體   English   中英

ASP.NET中的客戶端時區

[英]Client Timezone in ASP.NET

我有一個表需要在客戶端的時區顯示日期/時間。 但是,我很難找到有效地做到這一點的方法。 我知道我可以使用客戶端javascript獲取時區(並且這個方法有點不穩定),但我需要在Page_Load事件中,所以我不能事先調用javascript。

我可以從單獨的頁面(例如登錄時)獲取它,但這並不總是有效,因為有時人們會直接將書簽用於內部頁面,並繞過使用cookie的登錄。

所以我留下了一些選擇:1。為每個用戶提供一個緩存,我在每個機會都填寫一個回發,但不保證它是正確的)

  1. 嘗試一些奇怪的IP地理定位黑客

  2. 擁有允許用戶設置時區的用戶個人資料(再次,如果他們旅行,這也不總是正確的)

  3. 嘗試一些funkly頁面重定向強制回發,(但有些瀏覽器禁用頁面重定向)

  4. 讓用戶明確設置TZ

  5. 在Javascript中執行tz格式化

這些都不是理想的,在我看來,瀏覽器應該提供服務器的信息。 有沒有人有任何其他建議?

如果可能, 相對顯示時間。 而不是顯示特定的時間,使用散文,如“5分鍾前”或“上周”。

如果您必須在客戶端的時區顯示絕對時間,則根據您的評論我選擇#5,將UTC時間發送到瀏覽器,然后使用JavaScript顯示本地時間。 根據您的描述,用戶可以訪問需要在未登錄時顯示其時區的時間的頁面,因此將其存儲在用戶配置文件中似乎不夠。

我在不同時區的存儲和顯示日期和時間的建議中更詳細地討論了相對時間顯示概念, DateTime結構上提供了一個簡單的擴展方法,用於添加ToRelativeDateString方法,以便您可以編寫如下代碼:

string relativeTime = myDateTimeVariable.ToRelativeDateString();

希望這可以幫助...

我會使用混合策略:

  1. 用戶可以在其配置文件中設置時區
  2. 默認為“auto”,表示:使用JavaScript格式化

將時區保留在用戶配置文件中但是在您顯示它的每個頁面上(或在母版頁中)讓用戶能夠調整它。 一旦調整后允許它在會話的剩余時間內持續存在,如果他們想要設置,那么他們將需要在他們的配置文件中設置它。

5,2,3,4,1可能是您選擇的最佳順序。

只需以UTC格式輸出所有時間,然后在客戶端轉換為本地時間。

我不得不同意斯科特邁克爾。 顯示相對時間,如果您需要絕對時間,瀏覽器已經知道如何從UTC本地化它們。

但是,如果您正在尋找使用javascript強大地檢測時區(使用服務器端); 看看jsTimezoneDetect 它將為您提供一個Olsen時區密鑰,您可以將其用於日期時間的服務器端規范化。

我以為我會給你一個更新。 我確實采取了在客戶端格式化日期的各種建議(或者更具體地說,重新格式化它。)作為Google飼料,我在本文末尾對此進行了完整的解釋。

但是,問題是Date.toLocaleString沒有參數來控制格式,因此,在我的美國語言環境中,無論如何,我得到一個很大的字符串“星期六,2010年11月27日下午3:58:38”這也是笨重,我想要一個緊湊的格式,如星期六11/27/10 3:58 PM“但是沒有辦法控制它AFAIK。

因此,我將修改以嘗試根據回發時區偏移的各個關鍵頁面的輸入緩存會話中的時區,並包括修改用戶配置文件中的tz的功能。 這不是很好,但它是我能想到的最好的。 就像我說的,這應該包含在瀏覽器的http標頭中。

-----客戶端格式化------------

所以我有這樣的標簽(在ListView FWIW中):

<asp:Label ID="TimeLabel" runat="server" class="UTCTimeCell Hidden">
    <%# Eval("when") %> UTC
</asp:Label>

請注意,您必須為時區包含UTC,因為默認的ASP.NET格式化程序不包含它。 (這里我假設您將日期存儲為UTC,幾乎在所有情況下都應該這樣。)注意Hidden是我用display:none的標准css類。

然后我在我的utilities javascript中定義了以下函數(顯然我使用jQuery ...)

function timeFormatLocal(timeStr) {
    var dt = new Date(timeStr);
    return dt.toLocaleString();
}

function timeReformatLocal(selector) {
    $(selector).each(function () {
        $(this).html(timeFormatLocal($(this).html()));
    });
}

然后在我的頁面准備事件中我使用這樣的東西:

timeReformatLocal(".UTCTimeCell");
$(".UTCTimeCell").removeClass("Hidden");

這會將這些標簽單元格重新格式化為基於區域設置的格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM