2009-03-03 4 views
3

사용자가 현재 자바 스크립트로 OS에 설정 한 현재 zoneinfo 문자열 ("America/Los Angeles", "Europe/London"등)을 가져 오는 데 관심이 있습니다. 나는 현재의 오프셋을 초 단위로 가져 오는 방법과 특정 날짜의 오프셋 및 정확한 시간대 (PST 등)를 찾는 방법을 찾았지만 Olson의 zoneinfo는 찾지 못했습니다. 이것이 가능한가?JavaScript로 시스템의 Olson zoneinfo를 어떻게 결정합니까?

답변

0

자바에서 zoneinfo 데이터의 배열 또는 해시를 설정하고 선택 한 시간을 기준으로 이름을 결정해야합니다.

1

아니요. 죄송합니다! TimeZone을 사용하여 Java 애플릿을 통해 가져올 수 있지만 JavaScript에서는 UTC 오프셋을 모두 가져올 수 있습니다. (이름이 로캘에 따라 다르므로 표준 시간대 이름의 추측은 신뢰할 수 없습니다. UTC 오프셋과 일치하여 몇 가지 일반적인 경우를 감지 할 수 있지만 많은 작업이 필요합니다.)

일반적으로 Olson처럼 세분화 된 수준으로 시간대를 지원하려면 사용자에게 명시 적으로 선택 가능한 시간대 컨트롤을 제공해야합니다.

2

fleegix.js's date.Date plugin을 참조하십시오. 당신은 아마 그냥 parts you need 밖으로 해킹 할 수

function getRegionForTimezone(tz) { 
    var exc = regionExceptions[tz]; 
    if (exc) { 
     return exc; 
    } 
    else { 
     reg = tz.split('/')[0]; 
     return regionMap[reg]; 
    } 
    } 
3

나는 매우 다시 몇 달을 발급이에 근무하고 결과는 이것이다 : http://site.pageloom.com/automatic-timezone-detection-with-javascript. 스크립트는 가능한 가장 정확한 결과를 제공하지 않습니다. 예를 들어, 중부 유럽 표준 시간대에 상관없이 유럽/베를린을 반환합니다.

기본적으로 일광 절약 시간 전환이 발생할 때 알려진 날짜를 확인합니다.

잘하면 도움이됩니다.

1

Jon Nylander의 멋진 탐지기 (Josh Fraser의 스크립트 인 http://www.onlineaspect.com)를 사용하여 좀 더 간단한 스크립트를 만들었습니다. Nylander의 스크립트 (jQuery와 마찬가지로 https://github.com/scottwater/jquery.detect_timezone에 있음)는 ambiquities 목록을 사용하고 DST 시작 시간은 현지 시간과 같습니다. 내 스크립트에는 하나의 목록 만 있으며 모든 날짜는 필요한 경우 시간대를 쉽게 추가하거나 수정할 수 있도록 UTC로되어 있습니다.

사용법 :
이 -의 .js로 저장 및 HTML 헤더 섹션
에 포함 - get_timezone_id()를 호출하고 사용자의 시간대가 예 반환됩니다. "Europe/Helsinki"

이 스크립트는 90 시간대를 감지 할 수 있지만 더 많이 필요하면 GeoLocation API 또는 일부 서버 측 라이브러리 (geoIP)를 사용해야합니다. 목적에 따라 사용자가 선택할 수있는 시간대 목록을 추가하는 것도 고려하십시오.

미래의 브라우저와 시스템이 2011 년의 전환 데이터를 보존 할 방법을 모르기 때문에 미래에 어느 정도 조정해야 할 수도 있습니다. (나는 1970-80 년에 날짜를 테스트했고 동일한 시스템의 브라우저에서 결과가 크게 달라졌다. (!)) 그러나 운 좋게도 2011 년은 지나갔고 거의 모든 시스템이 희망에 따라 tz- 데이터베이스를 업데이트했으며 탐지가 이루어져야합니다. 꽤 좋아.

/* 
This script (Javascript Timezone Detection) detects Olson timezone 
ID of user's system's timezone using getTimezoneOffset(). Detection 
is tested and passed 100% in the following conditions: 

* Windows 7,Opera 11.00 
* Windows 7,Firefox 3.6.13 
* Windows 7,Safari 5.0.3 
* Windows 7,Google Chrome 8.0.552.237 
* Windows 7,Internet Explorer 8.0.7600.16385 

* Mac OS X,Google Chrome 8.0.552.237 
* Mac OS X,Firefox 3.6.13 
* Mac OS X,Opera 11.01 
* Mac OS X,Safari Version 5.0.3 

* Centos 5,Firefox 3.6.13 
* Centos 5,Safari 
* Centos 5,Opera 11.00 

The script has ability to detect 90 timezones. 

Every row in zones-array consist of 
0: Olson timezone ID, 
1-6: Transition start time in UTC (usually summer time start and sometimes winter time start) 
7: Utc offset in minutes 
8: 1 = has transition,0 = has not transition 


Timezones are listed in zones-array this way: 
- first comes section of timezones, that have transitions and then section of timezones that have no transitions 
- Both sections are then ordered by offset 
- Finally the has transitions section is ordered by the transition start time.  
If you add more timezones or replaces some, please be sure to maintain this order, otherwise the detection fails in some cases. 

Minified size: about 4.46KB 
*/  
var zones = new Array(
// FIRST DST TIMEZONES 
    [ 'Pacific/Apia',     2011,3,3,11,0,0,  -660, 1 ]/* For Opera Linux. Unexpectedly winter-offset. */, 

    [ 'Pacific/Apia',     2010,8,26,11,0,0,  -600, 1 ]/* STD: -660 */, 

    [ 'America/Adak',     2011,2,13,12,0,0,  -540, 1 ]/* STD: -600 */, 

    [ 'America/Anchorage',    2011,2,13,11,0,0,  -480, 1 ]/* STD: -540 */, 

    [ 'America/Los_Angeles',    2011,2,13,10,0,0,  -420, 1 ]/* STD: -480 */, 
    [ 'America/Santa_Isabel',   2011,3,3,10,0,0,  -420, 1 ]/* STD: -480 */, 

    [ 'America/Denver',     2011,2,13,9,0,0,  -360, 1 ]/* STD: -420 */, 
    [ 'America/Mazatlan',    2011,3,3,9,0,0,  -360, 1 ]/* STD: -420 */, 

    [ 'America/Chicago',     2011,2,13,8,0,0,  -300, 1 ]/* STD: -360 */, 
    [ 'America/Mexico_City',    2011,3,3,8,0,0,  -300, 1 ]/* STD: -360 */, 
    [ 'Pacific/Easter',     2011,9,9,4,0,0,  -300, 1 ]/* STD: -360 */, 

    [ 'America/Havana',     2011,2,13,5,0,0,  -240, 1 ]/* STD: -300 */, 
    [ 'America/New_York',    2011,2,13,7,0,0,  -240, 1 ]/* STD: -300 */, 

    [ 'America/Goose_Bay',    2011,2,13,4,1,0,  -180, 1 ]/* STD: -240 */, 
    [ 'America/Halifax',     2011,2,13,6,0,0,  -180, 1 ]/* STD: -240 */, 
    [ 'Atlantic/Stanley',    2011,8,4,6,0,0,  -180, 1 ]/* STD: -240 */, 
    [ 'America/Asuncion',    2011,9,2,4,0,0,  -180, 1 ]/* STD: -240 */, 
    [ 'America/Santiago',    2011,9,9,4,0,0,  -180, 1 ]/* STD: -240 */, 
    [ 'America/Campo_Grande',   2011,9,16,4,0,0,  -180, 1 ]/* STD: -240 */, 

    [ 'America/St_Johns',    2011,2,13,3,31,0,  -150, 1 ]/* STD: -210 */, 

    [ 'America/Miquelon',    2011,2,13,5,0,0,  -120, 1 ]/* STD: -180 */, 
    [ 'America/Godthab',     2011,2,27,1,0,0,  -120, 1 ]/* STD: -180 */, 
    [ 'America/Montevideo',    2011,9,2,5,0,0,  -120, 1 ]/* STD: -180 */, 
    [ 'America/Sao_Paulo',    2011,9,16,3,0,0,  -120, 1 ]/* STD: -180 */, 

    [ 'Atlantic/Azores',     2011,2,27,1,0,0,  0, 1 ]/* STD: -60 */, 
    [ 'Atlantic/Azores',     2010,2,28,3,0,0,  0, 1 ], /* Windows fix */ 

    [ 'Europe/London',     2011,2,27,1,0,0,  60, 1 ]/* STD: 0 */, 

    [ 'Europe/Berlin',     2011,2,27,1,0,0,  120, 1 ]/* STD: 60 */, 
    [ 'Africa/Windhoek',     2011,8,4,1,0,0,  120, 1 ]/* STD: 60 */, 

    [ 'Asia/Gaza',      2011,2,25,22,1,0,  180, 1 ]/* STD: 120 */, 
    [ 'Asia/Beirut',      2011,2,26,22,0,0,  180, 1 ]/* STD: 120 */, 
    [ 'Europe/Minsk',     2011,2,27,0,0,0,  180, 1 ]/* STD: 120 */, 
// Istanbul and Helsinki are the same, please select which one to use 
// [ 'Europe/Istanbul',     2011,2,27,1,0,0,  180, 1 ]/* STD: 120 */, 
    [ 'Europe/Helsinki',     2011,2,27,1,0,0,  180, 1 ]/* STD: 120 */, 
    [ 'Asia/Jerusalem',     2011,3,1,0,0,0,  180, 1 ]/* STD: 120 */, 
    [ 'Africa/Cairo',     2011,3,28,22,0,0,  180, 1 ]/* STD: 120 */, 
    [ 'Asia/Damascus',     2011,9,27,21,0,0,  120, 1 ]/* Unexpectedly here winter-offset */, 
    [ 'Asia/Amman',      2011,9,27,22,0,0,  120, 1 ]/* Unexpectedly here winter-offset */, 

    [ 'Europe/Moscow',     2011,2,26,23,0,0,  240, 1 ]/* STD: 180 */, 

    [ 'Asia/Tehran',      2009,2,21,20,30,0, 270, 1 ]/* STD: 210 */, 

    [ 'Asia/Yerevan',     2011,2,26,22,0,0,  300, 1 ]/* STD: 240 */, 
    [ 'Asia/Baku',      2011,2,27,0,0,0,  300, 1 ]/* STD: 240 */, 

    [ 'Asia/Yekaterinburg',    2011,2,26,21,0,0,  360, 1 ]/* STD: 300 */, 

    [ 'Asia/Omsk',      2011,2,26,20,0,0,  420, 1 ]/* STD: 360 */, 

    [ 'Asia/Krasnoyarsk',    2011,2,26,19,0,0,  480, 1 ]/* STD: 420 */, 

    [ 'Asia/Irkutsk',     2011,2,26,18,0,0,  540, 1 ]/* STD: 480 */, 

    [ 'Asia/Yakutsk',     2011,2,26,17,0,0,  600, 1 ]/* STD: 540 */, 

    [ 'Australia/Adelaide',    2011,9,1,16,30,0,  630, 1 ]/* STD: 570 */, 

    [ 'Asia/Vladivostok',    2011,2,26,16,0,0,  660, 1 ]/* STD: 600 */, 
    [ 'Australia/Lord_Howe',    2011,9,1,15,30,0,  660, 1 ]/* STD: 630 */, 
    [ 'Australia/Sydney',    2011,9,1,16,0,0,  660, 1 ]/* STD: 600 */, 

    [ 'Pacific/Fiji',     2011,2,5,14,0,0,  720, 1 ]/* STD: 660 */, 
    [ 'Pacific/Fiji',     2011,2,26,14,0,0,  720, 1 ]/* STD: 660 */, 
    [ 'Asia/Kamchatka',     2011,2,26,15,0,0,  720, 1 ]/* STD: 660 */, 

    [ 'Pacific/Auckland',    2011,8,24,14,0,0,  780, 1 ]/* STD: 720 */, 

    [ 'Pacific/Chatham',     2011,8,24,14,0,0,  825, 1 ]/* STD: 765 */, 

// AND THEN NON-DST TIMEZONES: 

    [ 'Etc/GMT+12',      2011,0,1,0,0,0,  -720, 0 ]/* STD: -720 */, 

    [ 'Pacific/Pago_Pago',    2011,0,1,0,0,0,  -660, 0 ]/* STD: -660 */, 

    [ 'Pacific/Kiritimati',    2010,0,1,0,0,0,  840, 0, '(LINT)' ], /* To prevent Firefox detecting Pacific/Kiritimati as Pacific Honolulu */ 
    [ 'Pacific/Honolulu',    2011,0,1,0,0,0,  -600, 0 ]/* STD: -600 */, 

    [ 'Pacific/Marquesas',    2011,0,1,0,0,0,  -570, 0 ]/* STD: -570 */, 

    [ 'Pacific/Gambier',     2011,0,1,0,0,0,  -540, 0 ]/* STD: -540 */, 

    [ 'Pacific/Pitcairn',    2011,0,1,0,0,0,  -480, 0 ]/* STD: -480 */, 

    [ 'America/Phoenix',     2011,0,1,0,0,0,  -420, 0 ]/* STD: -420 */, 

    [ 'America/Guatemala',    2011,0,1,0,0,0,  -360, 0 ]/* STD: -360 */, 

    [ 'America/Bogota',     2011,0,1,0,0,0,  -300, 0 ]/* STD: -300 */, 

    [ 'America/Caracas',     2011,0,1,0,0,0,  -270, 0 ]/* STD: -270 */, 

    [ 'America/Santo_Domingo',   2011,0,1,0,0,0,  -240, 0 ]/* STD: -240 */, 

    [ 'America/Argentina/Buenos_Aires', 2011,0,1,0,0,0,  -180, 0 ]/* STD: -180 */, 

    [ 'America/Noronha',     2011,0,1,0,0,0,  -120, 0 ]/* STD: -120 */, 

    [ 'Atlantic/Cape_Verde',    2011,0,1,0,0,0,  -60, 0 ]/* STD: -60 */, 

    [ 'Africa/Casablanca',    2011,0,1,0,0,0,  0, 0 ]/* STD: 0 */, 

    [ 'Africa/Lagos',     2011,0,1,0,0,0,  60, 0 ]/* STD: 60 */, 

    [ 'Africa/Johannesburg',    2011,0,1,0,0,0,  120, 0 ]/* STD: 120 */, 

    [ 'Asia/Baghdad',     2011,0,1,0,0,0,  180, 0 ]/* STD: 180 */, 

    [ 'Asia/Dubai',      2011,0,1,0,0,0,  240, 0 ]/* STD: 240 */, 

    [ 'Asia/Kabul',      2011,0,1,0,0,0,  270, 0 ]/* STD: 270 */, 

    [ 'Asia/Karachi',     2011,0,1,0,0,0,  300, 0 ]/* STD: 300 */, 

    [ 'Asia/Kolkata',     2011,0,1,0,0,0,  330, 0 ]/* STD: 330 */, 

    [ 'Asia/Kathmandu',     2011,0,1,0,0,0,  345, 0 ]/* STD: 345 */, 

    [ 'Asia/Dhaka',      2011,0,1,0,0,0,  360, 0 ]/* STD: 360 */, 

    [ 'Asia/Rangoon',     2011,0,1,0,0,0,  390, 0 ]/* STD: 390 */, 

    [ 'Asia/Jakarta',     2011,0,1,0,0,0,  420, 0 ]/* STD: 420 */, 

    [ 'Asia/Shanghai',     2011,0,1,0,0,0,  480, 0 ]/* STD: 480 */, 

    [ 'Australia/Eucla',     2011,0,1,0,0,0,  525, 0 ]/* STD: 525 */, 

    [ 'Asia/Tokyo',      2011,0,1,0,0,0,  540, 0 ]/* STD: 540 */, 

    [ 'Australia/Darwin',    2011,0,1,0,0,0,  570, 0 ]/* STD: 570 */, 

    [ 'Australia/Brisbane',    2011,0,1,0,0,0,  600, 0 ]/* STD: 600 */, 

    [ 'Pacific/Noumea',     2011,0,1,0,0,0,  660, 0 ]/* STD: 660 */, 

    [ 'Pacific/Norfolk',     2011,0,1,0,0,0,  690, 0 ]/* STD: 690 */, 

    [ 'Pacific/Tarawa',     2011,0,1,0,0,0,  720, 0 ]/* STD: 720 */, 

    [ 'Pacific/Tongatapu',    2011,0,1,0,0,0,  780, 0 ]/* STD: 780 */, 

    [ 'Pacific/Kiritimati',    2011,0,1,0,0,0,  840, 0 ]/* STD: 840 */ 
) 

function get_timezone_id() 
{ 
    var tz=""; 
    for (var i in zones) 
    { 
     olson_name = zones[i][0]; 
     has_transitions = zones[i][8]; 

     date_1 = new Date(Date.UTC(zones[i][1],zones[i][2],zones[i][3],zones[i][4],zones[i][5],zones[i][6])); 
     date_1_offset_data = zones[i][7]; 
     date_1_offset_user = -date_1.getTimezoneOffset(); 

     date_2 = new Date(Date.UTC(zones[i][1],zones[i][2],zones[i][3],zones[i][4],zones[i][5],zones[i][6]) - 1000); 
     date_2_offset_user = -date_2.getTimezoneOffset(); 

     var patt1=/\([^)]+\)/g; 
     if (zones[i][9] != undefined) var abbr = zones[i][9]; // To determine Pacific/Kiritimati in Firefox 
     else var abbr = ""; 

     if 
     ( 
      abbr == date_1.toString().match(patt1) 
      // Detect timezones that has transitions 
      || (has_transitions && date_1_offset_user == date_1_offset_data && date_2_offset_user != date_1_offset_data) 
      // Detect timezones that has not transitions 
      || (!has_transitions && date_1_offset_data == date_1_offset_user) 
     ) 
     { 
      tz = olson_name; 
      return tz; 
     } 
    } 
} 
관련 문제