서머 타임: 웹에서 과거 날짜 및 시간 계산 처리
서머 타임: 웹에서 과거 날짜 및 시간 계산 처리
웹 개발자들은 전 세계에서 사용 가능한 응용 프로그램을 개발하여 고객층을 해외까지 확대하기를 원합니다. Internet Explorer 10에서는 기본 OS에서 이미 제공하고 있는 과거 일광 절약 시간제를 웹 개발자에게도 제공합니다. 따라서 이제는 앱과 사이트의 시간 정보를 다양한 시간대에서의 과거 날짜 및 시간에 맞춰 더욱 정확하게 조작할 수 있습니다.
올해 초, 우리는 최근에 화두로 떠오르고 있는 ECMAScript Internationalization API를 살펴보았습니다. ECMAScript Internationalization API로는 웹 표준 플랫폼 내에서 통화 표시나 로캘 구분 문자열 비교 같은 작업이 가능한데 이전에는 이런 작업을 하려면 기본적으로 상호 운용성 지원이 되든지 플러그인을 적용하든지 해야만 했습니다. 전 세계에서 사용 가능한 웹 플랫폼 개발이라는 동일한 주제 아래, 우리는 브라우저에서 과거 날짜 및 시간대 정보를 조작하는 방식을 살펴볼 수 있는 데모를 게시했습니다.
과거 날짜 및 시간을 계산할 때 발생하는 문제점
과거의 주식 가격, 생일 또는 역사적 사건을 해석하는 등 과거 날짜를 조작할 때 웹 개발자들이 서버에서 유효성 검사를 수행해야 하는 경우가 자주 있습니다. 현재 JavaScript 엔진에서 일광 절약 시간제를 적용하여 계산한 날짜는 .NET, PHP/Perl, Java 등 주로 서버에서 실행되는 플랫폼만큼은 정확하지 않기 때문에 개발자들은 서버에 의존해야 합니다. JavaScript의 과거 날짜는 부정확할 뿐 아니라 브라우저 플랫폼 간에 상호 운용이 안 되는 경우도 자주 있습니다. 따라서 개발자는 JavaScript에서 생성한 DST 조정 날짜를 완전히 신뢰할 수 없습니다.
IE10은 ECMAScript 6 규격 초안 15.9.1.8 섹션의 변경 사항에 따라 보다 정확한 DST 조정 날짜를 제공하는 최초의 브라우저입니다. 우리는 웹 개발자가 요구 사항을 해결하기 위해 서버와 상호 작용해야 하는 시나리오를 기반으로 웹 플랫폼의 기능을 확장했습니다. JavaScript 엔진이 과거 날짜를 해석하여 DST를 적용하는 방식을 살펴본 결과, 기존 JavaScript 엔진으로는 일광 절약 시간을 정확하게 조정할 수 없다는 ECMAScript 표준 규격의 단점을 발견했습니다. 우리는 ECMAScript 표준 위원회와 협력하여 ECMAScript 규격의 차세대 버전에서는 DST 조정 시간의 정확도를 높일 수 있도록 규격을 변경해야 한다고 제안했습니다.
테스트 드라이브 데모 탐색
데모 하단에 있는 우주 항공의 역사적 사건 아이콘 중 하나를 클릭하여 과거 날짜 테스트 드라이브 데모를 실행하면 이 문제를 살펴보고 여러분이 선호하는 브라우저에서 과거 날짜를 어떻게 처리하는지 알아볼 수 있습니다. 브라우저에서는 사건이 발생한 과거 날짜를 읽어서 사건 발생 시간에 대한 브라우저의 기본값으로 설정된 일광 절약 규칙을 적용하여 날짜와 시간을 표시합니다. 그러면 데모에서 과거 날짜와 일광 절약 시간이 정확한지 확인합니다.
위의 사례에서 IMAGE 우주선이 발사된 과거 날짜를 볼 때 태평양 표준시에 속하는 Windows 8 컴퓨터에서 실행되는 IE10은 이제 과거의 사건에 대한 올바른 날짜 및 일광 절약 시간을 정확하게 확인할 수 있습니다.
참고: 모든 시간대에 일광 절약 시간을 적용할 수 있는 것은 아니며, 일광 절약 규칙이 한 번도 바뀌지 않은 시간대도 있습니다. 현재 이러한 시간대가 적용되는 시스템을 사용 중인 분은 태평양 표준시 같은 일광 절약 규칙이 있으면서 시간이 지남에 따라 그 규칙이 변경된 그러한 시간대로 시스템 시간대를 변경한 후 데모를 다시 실행하는 것이 좋습니다. IE10은 시스템 시간대를 변경하면 즉시 적용되지만 다른 브라우저의 경우에는 업데이트된 시간대를 적용하려면 브라우저를 다시 시작해야 할 수도 있습니다.
과거 날짜 및 시간을 처리하는 기능이 개선된 IE10
현재 ECMAScript 규격이 JavaScript의 DST 날짜 조정 정확도에 어떤 영향을 미치는지 자세히 알아보겠습니다.
ECMAScript 5.1의 15.9.1.8 섹션은 Internet Explorer의 Chakra 엔진 같은 JavaScript 구현에서 과거 날짜를 처리할 때 일반적으로 따라야 하는 사항을 명시하고 있습니다.
ECMAScript 구현에서 정확한 시간을 구하려면 일광 절약 시간을 적용했는지 여부를 확인하는 대신, 현재의 일광 절약 시간 알고리즘을 그 당시 시간에 적용해도 일광 절약 시간이 유효한지 확인합니다. 이렇게 하면 로캘이 일광 절약 시간을 따르는 연도까지 1년 내내 고민하고 있어야 할 필요가 없습니다.
호스트 환경에서 일광 절약 시간을 확인할 수 있는 기능을 제공할 경우 문제가 되는 연도를 호스트 환경에서 일광 절약 시간 정보를 제공하는 동등 연도(윤년과 시작 날짜가 같은 연도)와 자유롭게 매핑할 수 있습니다.단, 어떤 동등 연도를 대입해도 결과가 같아야 한다는 것이 유일한 제약입니다.
간단하게 정리하자면, 과거 날짜를 처리하려면 JavaScript 구현에서 현재의 일광 절약 시간 알고리즘을 과거 날짜에 적용합니다. 또는 해당 연도의 1월 1일을 확인하여 윤년인지 계산하고, 특성(시작 날짜 및 윤년)이 같은 연도의 현재 일광 절약 시간 규칙을 찾아서 과거 날짜에 일광 절약 시간을 적용합니다. 두 번째 방법의 예를 들자면, 1972년은 토요일로 시작하는 윤년이었고 토요일로 시작하는 그 다음 윤년은 2000년이었습니다. 언어 규격에 따라 1972년의 날짜를 조작할 때에는 JavaScript 구현에서 현재 일광 절약 규칙을 사용하거나 2000년의 일광 절약 규칙을 사용하면 됩니다.
위의 두 규칙 중 하나를 사용하여 과거 날짜에 일광 절약 시간 규칙을 적용할 때 두 가지 문제가 발생합니다. 첫째, 특정 시간대의 일광 절약 규칙은 일정하지 않고 시간이 흐르면서 변합니다. 이로 인해 과거 날짜에 잘못된 규칙이 적용될 수 있습니다. 둘째, 과거 날짜는 현재 실행 중인 OS 플랫폼에 의해 계산되므로 시간이 지나면서 일광 절약 규칙이 변하는 시간대의 경우 웹 응용 프로그램이 더 이상 패리티를 유지할 수 없습니다. 따라서 개발자가 웹 응용 프로그램과 현재 실행 중인 플랫폼 간의 상호 운용성 문제를 임시로 해결해야 하는 경우가 종종 있습니다.
위에서 살펴본 15.9.1.8 섹션의 ECMAScript 5.1 규격 텍스트에서는 일광 절약 시간 조정에 대해 구현에서 원하는 만큼 오차를 허용하는 동시에 일정 수준 이상의 정확성을 요구하고 있습니다. 이는 다소 이해하기 어려운 사항이며, 실제로도 브라우저 간에 합의를 끌어내지 못했습니다. 15.9.1.8 섹션의 내용처럼 시간대 오프셋 동작을 제한하는 대신 DaylightSavingsTA 구현에 따라 결정되도록 내버려 두어야 합니다.
우리가 수행한 테스트 결과에 따르면, 기존 브라우저 구현(최신 버전) 중 모든 플랫폼에서 표준에 규정된 동작을 완벽하게 준수하거나 날짜를 처리할 때 DST를 정확하게 조정하는 브라우저는 하나도 없었습니다. 다음은 미국 태평양 표준시에서 달라지는 날짜를 보여 주는 예입니다.
날짜 | Windows | Debian | Mac | |||||||
IE9 | Chrome | Firefox | Opera | Safari | Node | Node | Chrome | Firefox | Safari | |
4/1/2000 | 420 | 420 | 420 | 420 | 420 | 420 | 480 | 480 | 480 | 420 |
이 날짜에서 Chrome, FireFox, Node는 OS에 따라 값이 다릅니다. 사실 거의 대부분이 틀렸는데, 실제 DST 조정 시간은 480입니다.
날짜 | Windows | Debian | Mac | |||||||
IE9 | Chrome | Firefox | Opera | Safari | Node | Node | Chrome | Firefox | Safari | |
3/10/2011 | 480 | 480 | 480 | 480 | 480 | 480 | 480 | 480 | 480 | 480 |
3/10/2109 | 480 | 480 | 480 | 480 | 420 | 480 | 480 | 480 | 420 | 420 |
이 날짜에서 다시 몇몇 환경이 ES5.1 규칙을 위반했습니다(두 연도 모두 화요일에 시작하고 윤년이 아님). 그리고 같은 OS에서도 날짜가 달랐으며 이것은 Windows와 Mac 모두 마찬가지였습니다.
전망
Internet Explorer 10부터 Chakra 엔진은 브라우저가 실행되는 Windows 플랫폼에서 제공하는 일광 절약 시간제 정보를 사용하여 현지 시간과 UTC를 변환합니다.
우리는 규격 문제를 보고한 후 차세대 ECMAScript 규격을 명확하게 규정하기 위해 ECMAScript 표준 위원회와 협력하여 웹 플랫폼의 상호 운용성을 지원하고 정확성을 높였습니다. ECMAScript 6 규격의 최신 초안에는 보다 정확하고 개선된 일광 절약 시간 규칙을 날짜에 적용하여 보다 정확한 정보를 제공하는 방법이 자세하게 설명되어 있습니다. IE10은 업데이트된 규격을 따르는 최초의 브라우저입니다. 다른 브라우저도 다음 버전부터는 이러한 문제를 해결하는 기능이 강화되어 웹 개발자들이 전 세계적으로 사용 가능한 응용 프로그램을 개발할 수 있게 되기를 바랍니다.
웹 플랫폼의 중요성이 높아지면서 최근에는 일정 응용 프로그램, 스프레드시트, 프로젝트 관리 소프트웨어 등에 사용되는 논리를 포함하여 응용 프로그램 논리 전체를 JavaScript로 작성하는 경우도 자주 있습니다. 개발자들이 호환성을 유지할 수 있도록 이러한 변화를 지원하는 것은 IE10의 표준 모드뿐입니다. 웹 응용 프로그램에서 과거 날짜를 계산하고 브라우저의 부정확성을 해결하기 위해 사용자 지정 논리를 사용하는 분은 웹 응용 프로그램이 IE10에서 작동하도록 업그레이드할 때 사용자 지정 논리도 올바르게 작동되도록 유의하시기 바랍니다.
- JavaScript 팀 프로그램 관리자, Suresh Jayabalan