我可以在ASP.NET中獲得瀏覽器時區,還是必須依賴JS操作來檢索信息:我可以在ASP.NET中獲取瀏覽器時區還是必須依賴JS操作來檢索信息?
回答
沒有「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';
}
如果沒有在客戶端上運行的東西(如JavaScript),則無法檢索時區,因爲ASP.NET是服務器端。
是的,我希望有東西傳回頭,我可以確定它在服務器上,並呈現相應的頁面。 – Matt 2010-05-17 23:11:43
假設我使用JS,那麼我如何通過JS在c#page_Load事件上獲取時區? – 2016-12-08 09:52:37
你不能,你需要發送一個AJAX請求,然後存儲它在會議中。 – ThiefMaster 2016-12-09 21:13:17
你不能可靠地從瀏覽器中得到了客戶的時區設置!在客戶端或服務器端。
您可以從JavaScript,獲得使用Date#getTimezoneOffset
偏移從UTC當前時區,這並不唯一標識一個時區,不過,因爲有許多區域可能使用相同的UTC偏移量以及許多切換時間的區域DST上的區域。
您有時可以通過調用Date#toLocaleString
獲取表示時區短名稱的字符串。不能保證會有可用的時區名稱,並且時區名稱不是全球唯一的,有時瀏覽器位於(特別是關於DST)。但經常有,如果你可以將這個縮寫與你已經閱讀的偏移量聯繫起來,並將其與已知時區規則的短名單進行比較,它會給你一個很好的初步猜測。您還可以將Accept-Language
標題的地理位置IP定位和服務器端地址用於更好地猜測。
如果用戶看到適當的本地時間很重要,則需要爲他們提供手動機制來選擇時區 - 規則區域設置(例如,作爲每個帳戶設置),因爲這些都不可靠。
如何通過JS在c#page_Load事件上獲取時區? – 2016-12-08 09:51:57
您需要依賴於javascript。這是一個庫來做到這一點 - detect_timezone.js
我有這個lib的一些問題:https://bitbucket.org/pellepim/jstimezonedetect/issue/106/america-toronto – ses 2015-02-11 20:57:30
- 1. 獲取客戶操作系統/瀏覽器的詳細信息
- 2. 我必須依賴編譯器NRVO嗎?
- 3. 我可以從android瀏覽器JavaScript獲得什麼信息?
- 4. 從IOwinContext獲取瀏覽器信息
- 5. 何處獲取此瀏覽器信息?
- 6. 服務器可以檢測請求是來自擴展還是瀏覽器?
- 7. 在asp.net MVC中,依賴注入是必須的嗎?
- 8. 獲取事件瀏覽器操作
- 9. 我在瀏覽器中獲取報警信息,同時使用JSF primefaces
- 10. 是否可以在瀏覽器中設置時區?
- 11. ajax是否依賴於瀏覽器?
- 12. 製作多人遊戲時,我是否依賴瀏覽器不給玩家變量(所以他可以破解)?
- 13. 是否啓用JavaScript中的瀏覽器必須得到工作的ASP.NET頁面?
- 14. 我可以在Android上使用MySQL還是必須使用SQLite?
- 15. 獲取用戶信息,如用戶操作系統,瀏覽器,IP地址等
- 16. 獲取客戶瀏覽器和操作系統信息所需的服務
- 17. 獲取用戶瀏覽器,操作系統,閃存版本,JavaScript信息
- 18. 我可以使用Moodle'API'嗎?還是我必須刮它
- 19. 也必須在未來的瀏覽器中安裝Silverlight嗎?
- 20. 在PHP中檢索瀏覽器和操作系統
- 21. 除了檢索UserAgent之外,還有其他方式獲取瀏覽器信息嗎?
- 22. 如何在JSP中獲取瀏覽器信息?
- 23. 如何在C#WebDriver中獲取瀏覽器信息?
- 24. 在Outlook中獲取時區信息
- 25. 我必須使用正則表達式來提取消息還是有屬性?
- 26. mercurial respositories必須完全克隆還是可以獲得子樹?
- 27. 我必須是想要一個C#瀏覽器與NewWindow2和GetElementsByTagName
- 28. shoppingcart新手。我必須購買還是可以建立
- 29. 拒絕beforeRemote,我可以使用res.send還是必須使用next()?
- 30. 是否可以用JS讀取瀏覽器歷史記錄?
有很多方法可能會不準確。但是這對第一次猜測來說很好。 – bobince 2010-05-17 23:16:09