2010-05-17 25 views

回答

33

沒有「Accept-Timezone」標頭(或類似的標頭) - HTTP標準沒有包含任何工具來允許瀏覽器自動告訴服務器用戶關心什麼時區。

基本的方法是使用日期並從中讀取TZ信息。

既然沒有標準(跨瀏覽器的時區命名功能 - 你不得不求助於像(讓人驚訝):

function getTimezoneName() { 
    tmSummer = new Date(Date.UTC(2005, 6, 30, 0, 0, 0, 0)); 
    so = -1 * tmSummer.getTimezoneOffset(); 
    tmWinter = new Date(Date.UTC(2005, 12, 30, 0, 0, 0, 0)); 
    wo = -1 * tmWinter.getTimezoneOffset(); 

    if (-660 == so && -660 == wo) return 'Pacific/Midway'; 
    if (-600 == so && -600 == wo) return 'Pacific/Tahiti'; 
    if (-570 == so && -570 == wo) return 'Pacific/Marquesas'; 
    if (-540 == so && -600 == wo) return 'America/Adak'; 
    if (-540 == so && -540 == wo) return 'Pacific/Gambier'; 
    if (-480 == so && -540 == wo) return 'US/Alaska'; 
    if (-480 == so && -480 == wo) return 'Pacific/Pitcairn'; 
    if (-420 == so && -480 == wo) return 'US/Pacific'; 
    if (-420 == so && -420 == wo) return 'US/Arizona'; 
    if (-360 == so && -420 == wo) return 'US/Mountain'; 
    if (-360 == so && -360 == wo) return 'America/Guatemala'; 
    if (-360 == so && -300 == wo) return 'Pacific/Easter'; 
    if (-300 == so && -360 == wo) return 'US/Central'; 
    if (-300 == so && -300 == wo) return 'America/Bogota'; 
    if (-240 == so && -300 == wo) return 'US/Eastern'; 
    if (-240 == so && -240 == wo) return 'America/Caracas'; 
    if (-240 == so && -180 == wo) return 'America/Santiago'; 
    if (-180 == so && -240 == wo) return 'Canada/Atlantic'; 
    if (-180 == so && -180 == wo) return 'America/Montevideo'; 
    if (-180 == so && -120 == wo) return 'America/Sao_Paulo'; 
    if (-150 == so && -210 == wo) return 'America/St_Johns'; 
    if (-120 == so && -180 == wo) return 'America/Godthab'; 
    if (-120 == so && -120 == wo) return 'America/Noronha'; 
    if (-60 == so && -60 == wo) return 'Atlantic/Cape_Verde'; 
    if (0 == so && -60 == wo) return 'Atlantic/Azores'; 
    if (0 == so && 0 == wo) return 'Africa/Casablanca'; 
    if (60 == so && 0 == wo) return 'Europe/London'; 
    if (60 == so && 60 == wo) return 'Africa/Algiers'; 
    if (60 == so && 120 == wo) return 'Africa/Windhoek'; 
    if (120 == so && 60 == wo) return 'Europe/Amsterdam'; 
    if (120 == so && 120 == wo) return 'Africa/Harare'; 
    if (180 == so && 120 == wo) return 'Europe/Athens'; 
    if (180 == so && 180 == wo) return 'Africa/Nairobi'; 
    if (240 == so && 180 == wo) return 'Europe/Moscow'; 
    if (240 == so && 240 == wo) return 'Asia/Dubai'; 
    if (270 == so && 210 == wo) return 'Asia/Tehran'; 
    if (270 == so && 270 == wo) return 'Asia/Kabul'; 
    if (300 == so && 240 == wo) return 'Asia/Baku'; 
    if (300 == so && 300 == wo) return 'Asia/Karachi'; 
    if (330 == so && 330 == wo) return 'Asia/Calcutta'; 
    if (345 == so && 345 == wo) return 'Asia/Katmandu'; 
    if (360 == so && 300 == wo) return 'Asia/Yekaterinburg'; 
    if (360 == so && 360 == wo) return 'Asia/Colombo'; 
    if (390 == so && 390 == wo) return 'Asia/Rangoon'; 
    if (420 == so && 360 == wo) return 'Asia/Almaty'; 
    if (420 == so && 420 == wo) return 'Asia/Bangkok'; 
    if (480 == so && 420 == wo) return 'Asia/Krasnoyarsk'; 
    if (480 == so && 480 == wo) return 'Australia/Perth'; 
    if (540 == so && 480 == wo) return 'Asia/Irkutsk'; 
    if (540 == so && 540 == wo) return 'Asia/Tokyo'; 
    if (570 == so && 570 == wo) return 'Australia/Darwin'; 
    if (570 == so && 630 == wo) return 'Australia/Adelaide'; 
    if (600 == so && 540 == wo) return 'Asia/Yakutsk'; 
    if (600 == so && 600 == wo) return 'Australia/Brisbane'; 
    if (600 == so && 660 == wo) return 'Australia/Sydney'; 
    if (630 == so && 660 == wo) return 'Australia/Lord_Howe'; 
    if (660 == so && 600 == wo) return 'Asia/Vladivostok'; 
    if (660 == so && 660 == wo) return 'Pacific/Guadalcanal'; 
    if (690 == so && 690 == wo) return 'Pacific/Norfolk'; 
    if (720 == so && 660 == wo) return 'Asia/Magadan'; 
    if (720 == so && 720 == wo) return 'Pacific/Fiji'; 
    if (720 == so && 780 == wo) return 'Pacific/Auckland'; 
    if (765 == so && 825 == wo) return 'Pacific/Chatham'; 
    if (780 == so && 780 == wo) return 'Pacific/Enderbury' 
    if (840 == so && 840 == wo) return 'Pacific/Kiritimati'; 
    return 'US/Pacific'; 
} 
+4

有很多方法可能會不準確。但是這對第一次猜測來說很好。 – bobince 2010-05-17 23:16:09

0

如果沒有在客戶端上運行的東西(如JavaScript),則無法檢索時區,因爲ASP.NET是服務器端。

+2

是的,我希望有東西傳回頭,我可以確定它在服務器上,並呈現相應的頁面。 – Matt 2010-05-17 23:11:43

+0

假設我使用JS,那麼我如何通過JS在c#page_Load事件上獲取時區? – 2016-12-08 09:52:37

+0

你不能,你需要發送一個AJAX請求,然後存儲它在會議中。 – ThiefMaster 2016-12-09 21:13:17

6

你不能可靠地從瀏覽器中得到了客戶的時區設置!在客戶端服務器端。

您可以從JavaScript,獲得使用Date#getTimezoneOffset偏移從UTC當前時區,這並不唯一標識一個時區,不過,因爲有許多區域可能使用相同的UTC偏移量以及許多切換時間的區域DST上的區域。

您有時可以通過調用Date#toLocaleString獲取表示時區短名稱的字符串。不能保證會有可用的時區名稱,並且時區名稱不是全球唯一的,有時瀏覽器位於(特別是關於DST)。但經常有,如果你可以將這個縮寫與你已經閱讀的偏移量聯繫起來,並將其與已知時區規則的短名單進行比較,它會給你一個很好的初步猜測。您還可以將Accept-Language標題的地理位置IP定位和服務器端地址用於更好地猜測。

如果用戶看到適當的本地時間很重要,則需要爲他們提供手動機制來選擇時區 - 規則區域設置(例如,作爲每個帳戶設置),因爲這些都不可靠。

+0

如何通過JS在c#page_Load事件上獲取時區? – 2016-12-08 09:51:57

9

您需要依賴於javascript。這是一個庫來做到這一點 - detect_timezone.js

+0

我有這個lib的一些問題:https://bitbucket.org/pellepim/jstimezonedetect/issue/106/america-toronto – ses 2015-02-11 20:57:30

相關問題