내 웹앱에서 시간대를 어떻게 처리 할 수 ​​있습니까?


104

다음 사용자 스토리를 더 잘 이해하고 싶습니다.

John은 Sidney에서 일합니다. 오전 9시에 그는 취리히의 서버에서 실행되는 웹 앱에 이벤트를 기록합니다. 다음날 그는 사건에 대해 논의해야 할 긴급 회의를 위해 뉴욕으로 여행합니다. 회의 중에 그는 날짜와 시간별로 이벤트를 검색합니다.

내가보기에 여기에 최소한 두 가지 문제가 있습니다.

  1. 데이터베이스에 타임 스탬프를 저장하려면 어떻게해야합니까?
  2. UI에 어떻게 표시해야합니까?

John이 이벤트를 검색하면 9시에 발생했음을 알 수 있지만 웹 브라우저에 무엇을 입력해야합니까? 그는 취리히 또는 뉴욕 시간 일 수 있기 때문에 타임 스탬프로 "9:00"를 입력 할 때 아무것도 찾을 수 없습니다 (이벤트가 발견되지 않았기 때문에 앱이 시드니에서 발생했음을 알 수있는 방법이 없으므로 올바른 시간대를 자동으로 선택할 수 없습니다.)

사용자에게 시간대를 포함 할 수있는 타임 스탬프를 요청하는 좋은 방법은 무엇입니까?

두 번째 문제는 결과를 표시하는 방법입니다. 전 세계의 팀이 이벤트에 대해 논의하고 관련 이벤트를 찾아야하는 경우 한 번에 전 세계 여러 사이트를 대상으로하는 크래커 공격을 생각해보십시오.

다른 시간대에서 생성되었을 수있는 타임 스탬프를 표시하는 좋은 예는 무엇입니까?

참고 : 요구 사항의 유용성에 집중하십시오. 데이터베이스 매핑을 직접 파악할 수 있습니다. 현재 작업 흐름에 대해 잘 모르겠습니다. 방해가되지 않고 직관적 인 방식으로 필요한 정보를 요청 / 제시해야합니다. 가능하다면 이미이 문제를 해결 한 기존 웹 앱에 대한 링크를 제공하십시오.


5
Stack Overflow는 모든 것을 UTC에 넣어이 문제를 해결합니다. 항상 편리하지는 않지만 확실히 명확하고 구현하기 어렵지 않으며 작동합니다.
Ry-

2
UTC는 유혹적이지만 OTOH이므로 여러 시간대에 걸쳐 이벤트를 동기화 할 필요가 없습니다.
아론 Digulla

3
관련 국가 중 하나가 이벤트가 예정된 후 현지 시간을 변경하는 법을 제정하면 이벤트가 발생하기 전에 어떻게됩니까? 시스템은 이것을 어떻게 처리해야합니까? en.wikipedia.org/wiki/…
Julius Musseau

1
이 유형의 고전적인 시간대 질문은 인터넷과 인쇄물에서 수십 년 동안 너무나 치명적이었습니다.이 질문에 대한 그러한 활발한 입력과 현상금을보고 놀랐습니다!
BenSwayne

2
필자는 명백한 점을 지적하여 복잡성을 추가합니다. 즉, 대부분의 서구 세계 가 1 년에 두 번 ( "일광 절약 시간") 시간대를 변경하고, 이것이 발생하는 시기에 대한 규칙 이 전 세계적으로 균일하지도 않고 반드시 사소하지도 않다는 점을 지적합니다 . 알고리즘 적으로 말하면?
fr13d

답변:


98

타임 스탬프를 저장하는 문제는 간단합니다. UTC로 저장하세요.

이를 표시하려면 기기의 시간대 설정을 가져와 현재 시간대로 사용하는 것이 좋습니다. 즉, "시간 입력"상자 옆에 시간대 드롭 다운이 있어야하며, 기본값은 기기의 현재 시간대로 설정되어 있으므로 사용자가 필요에 따라 변경할 수 있습니다.

대부분의 사용자는 시간대를 많이 또는 전혀 변경하지 않을 것입니다. 대부분의 경우 귀하가 설명한 상황은 흔하지 않습니다. 적절한 기본값으로 드롭 다운을 구현하면 이동하는 사람들이 일을 쉽게 할 수 있어야합니다 (일반적으로 여행자가 아닌 사람보다 시간대를 더 잘 이해하기 때문입니다).

실제로 앱이 처음 실행될 때 기기가 설정된 시간대를 저장 한 다음 변경되는지 확인하는 것이 더 좋습니다. 변경되는 경우 사용자는 아마도 여행자 일 것이며 시간대 드롭 다운을 사용하는 것이 도움이 될 것입니다. 그렇지 않으면 드롭 다운을 표시하지 않고 기기 시간대를 기본값으로 설정합니다 (사용자가 시간대에 대해 알 필요가 없기 때문). 두 경우 모두 사용자가 시간대 드롭 다운을 수동으로 표시 / 숨길 수있는 설정이 앱에 있습니다.


위의 내용을 요약하면 다음과 같습니다.

  • 처음 실행할 때 기기에 설정된 시간대를 저장합니다.
  • 해당 시간대를 기본 시간대로 사용합니다. 항상 그 시간대를 가정하십시오.
  • 기기가 시간대를 전환하는 경우 드롭 다운을 추가하여 이벤트가있는 시간대를 선택하고 기본값은 기기의 자체 시간대입니다.
  • 이 시간대 드롭 다운을 수동으로 표시 / 숨기기 옵션을 추가합니다.
  • 항상 UTC로 타임 스탬프를 저장하십시오.

"시간대"가 의미하는 바는 모호하게 사용 된 것 같습니다. 이것은 참조처럼 보입니다 : en.wikipedia.org/wiki/Tz_database "시간대"가 "Area / Location", 예를 들어 "America / New_York"라고 말할 수 있습니다. 예를 들어 America / Los_Angeles는 지구본이 일광 절약 시간 제로 운영되는지 여부에 따라 PST와 PDT를 모두 의미하기 때문에 지리적으로 좋은 것처럼 보입니다. 그렇다면 문제는 영역에 대한 UTC 오프셋의 2 년에 한 번 변경되는 사항을 어떻게 설명할까요? 또한 지리적으로 옳지 않은 "영역"이 아니기 때문에 우리는 이러한 약칭을 무엇이라고 부릅니까?
iJames

이것은 훌륭한 대답입니다. 시간대 정보를 저장하는 방법에 대한 모범 사례가 있습니까? 예를 들어- 'PST'또는 'America / Pacific'중 어느 것이 더 좋을까요? UTC의 타임 스탬프를 캡처 된 사용자 시간대로 쉽게 변환 할 수있는 방법은 무엇입니까? 이에 대한 모든 모범 사례를 주시면 감사하겠습니다.
Patthebug

27

애플리케이션에서 일반적으로 포럼 사이트에서 자주 볼 수있는 것처럼 처음 등록 할 때 사용자의 시간대를 저장하고 항상 시간대와 함께 시간을 표시합니다 .

날짜 저장에 관해서는 UTC가 갈 길입니다. UTC로 변환하고 데이터베이스에 고정하십시오. 검색하는 동안 시간을 ​​사용자가 설정 한 시간대로 변환하기 만하면됩니다.

나는 웹 앱의 모든 사용자에게 "새해 복 많이 받으세요"와 같은 맞춤형 알림을 보낼 수있는 유사한 사용 사례를 해결해야했습니다. 사용자가 전 세계에 흩어져 있으므로 시간대에 따라 알림을 표시해야했습니다. 타임 스탬프를 UTC로 저장하는 것은 문제없이 우리의 목적에 잘 맞았습니다.

사용 사례에서 사용자 시간대를 어딘가에 저장하지 않으면 gmaps와 같은 일종의 위치 감지를 사용하지 않는 한 사용자 입력을 요청하지 않고 검색 결과를 정확하게 반환 할 수 없습니다. t 신뢰할 수 있습니다. 따라서 사용자가 웹 사이트에 입력하는 내용을 알 수 있도록 매번 시간대를 요청해야합니다.

시간대 정보가있는 경우 전체 웹 앱을 시간대 설정으로 실행해야합니다. 따라서 사용자가 9:00를 검색하면 시드니 시간대로 검색하게됩니다. 반면에 그가 뉴욕에 앉아있는 동안 이벤트를 만들면 시드니 시간대로 이벤트를 만듭니다. 우리는 날짜를 표시하면서 항상 시간대를 표시하여 이러한 경우를 해결합니다.

도움이 되었기를 바랍니다. :)


이벤트를 검색하고 생성 할 때 시간대에 대한 드롭 다운을 추가하면 이것이 갈 길이라고 생각합니다. (뉴욕에서 동료가 만든 이벤트를 검색해야 할 때 직접 계산하고 싶지 않습니다.)
RasmusWL

이것은 훌륭한 대답입니다. 시간대 정보를 저장하는 방법에 대한 모범 사례가 있습니까? 예를 들어- 'PST'또는 'America / Pacific'중 어느 것이 더 좋을까요? UTC의 타임 스탬프를 캡처 된 사용자 시간대로 쉽게 변환 할 수있는 방법은 무엇입니까? 이에 대한 모든 모범 사례를 주시면 감사하겠습니다.
Patthebug

11
  1. UTC. 단순하게 유지하십시오.

  2. 사용자와 가장 관련있는 시간대를 사용하십시오.

    사용자가 이벤트를 위해 시드니에 있거나 시드니로 여행 할 것이라는 것을 알고 있다면 이벤트 로가는 교통편을 준비 할 때 해당 시간대를 생각할 것 입니다. 그들이 현재 뉴욕에 있다는 사실은 대체로 무관합니다. 물론 앱이 다양한 시간대의 날짜를 표시하는 경우 항상 날짜 옆에 시간대를 표시해야합니다 (예 : 09:00 EST) .

    인터페이스가 너무 복잡하지 않으면 이벤트 시간대와 현지 시간대로 날짜를 표시 할 수 있습니다 ( 예 : 2012-06-13 09:00 EST (2012-06-12 19:00 EDT)) .

    나는 검색이 비슷한 문제라고 주장하고 싶습니다. 한 가지주의 사항이 있습니다. 우리는 오탐을 용인 할 수 있지만 (예상하지 않은 결과를 얻음), 오탐을 견딜 수는 없습니다 (예상했던 결과를 얻지 못함).

    다시 말하지만, 사용자에게 가장 관련성이 높은 시간대 (예 : 이벤트 시간대)를 검색하는 데 초점을 맞추고 검색 결과에서 이러한 결과에 우선 순위를 부여하지만 사용자와 관련된 다른 시간대와 일치하는 이벤트를 반환 할 수도 있습니다 (예 : 현지 시각). 이렇게하면 특히 일치하는 텍스트를 강조 표시하는 경우 일치하는 시간대에 이벤트 날짜를 표시해야합니다.


7

여기에서는 구현 가능성에 대해 크게 신경 쓰지 않고 최상의 유용성을 제안합니다.
1. db에 이벤트를 저장하는 첫 번째 문제는 모두 UTC로 저장하는 것에 동의합니다

. 2. 최상의 사용자 경험을 제공하기 위해 사용자의 시간대 기록을 저장합니다. 시간대 변경의 타임 스탬프를 저장할 수 있다면 더욱 좋습니다. 이를 통해 매번 명시 적으로 시간대를 지정하지 않고도 사용자가 자유롭게 쿼리 할 수 ​​있습니다.

따라서 이러한 기능을 사용하여 John의 "9.00"검색 쿼리가 어떻게 처리되는지 살펴 보겠습니다.
위에서 언급 한 기능을 사용하면 John이 날짜까지 2 개의 시간대에 있었음을 알 수 있습니다 (또는 언급 된 기간에 대한 시간대 목록을 가져옵니다). 따라서 시드니 시간대에서 UTC로 9.00을 변환하고 쿼리를 실행합니다. 또한 9.00을 NewYork 시간대에서 UTC로 변환하고 쿼리를 실행하십시오. 결과적으로 John에게 2 행을 표시하여 시드니에서 9시에, 뉴욕에서 9시에 수행 한 작업을 표시합니다. 이 경우 뉴욕 줄은 비어 있지만이 시간대도 검색했음을 알리기 위해 사용자에게 여전히 표시되어야한다고 생각합니다.

3. 사용자에게 시간대를 포함 할 수있는 타임 스탬프를 요청하는 좋은 방법은 무엇입니까?

그의 시간대가 최근에 변경된 경우 애플리케이션에 로그인 할 때마다 기본 시간대가 기본 시간대로 변경된다는 알림이 제공되어야합니다.
이벤트 생성시 사용자가 드롭 다운에서 시간대를 선택한다고 가정 해 보겠습니다. 세계의 모든 시간대 옵션을 제공하여 사용자에게 부담을주지 않도록합니다. 드롭 다운의 첫 번째 옵션은 사용자 기기의 현재 시간대 여야합니다. 그의 시간대 기록에서 그 시간대, UTC, 그리고 그가 날짜까지 사용하지 않은 나머지 시간대.

4. 전 세계의 팀이 이벤트에 대해 논의해야하는 경우 결과를 표시하는 방법 :

이 사용 사례를 2 개 이상의 팀 수로 나누고 싶습니다.
단 2 개 팀의 경우 각 팀이 현지 시간대와 다른 팀의 시간대로 타임 스탬프를 보는 것이 좋습니다. (개인적으로 회의를 예약 할 때 편의를 위해 상대방의 시간대로 대화하는 것을 선호합니다.) 2 개 이상의 팀의 경우보다 일반적인 시간대 (예 : UTC)를 고려하는 것이 좋습니다. 따라서이 경우 모든 사용자는 2 개의 시간대, UTC 및 기본 시간대의 타임 스탬프를 볼 수 있습니다.

이러한 제안은 사용자가 자신의 현지 시간으로 계산을 수행 할 필요가 없지만 동시에 선호하는 시간대에서 다른 사용자와 유창하게 통신 할 수 있어야한다는 의도로 제공됩니다.


2
+1 사용자가 시드니에서 9:00에 이벤트에 입장했음을 알고 있기 때문에 이것은 매우 흥미로운 아이디어입니다. 따라서 동일한 사용자가 시간을 검색 할 때 (명시적인 시간대없이) "내가 어디에 있었는지 그 때 "
아론 Digulla

4

좋아 다른 접근 방식이 있습니다.

첫째, 나는 미리 몇 가지 사항을 가정했습니다.

이벤트를 등록하는 사람은 스마트 폰을 가지고 있습니다 (브라우저라면 이러한 가정을 할 필요가 없습니다).

  1. GPS

  2. HTML5 기능.

  3. 자바 스크립트 기능

타임 스탬프를 데이터베이스에 저장하려면 어떻게해야합니까?

솔루션 : 분명히 UTC , 아래 절차를 오버레이했습니다.

단계 1. 위치 정보 위치 측정의 API를 사용하여 사용자의

    window.onload = getMyLocation;

    function getMyLocation() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(displayLocation);
        } else {
            alert("Oops, no geolocation support");
        }
    }

    function displayLocation(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;
        var div = document.getElementById("location");
        div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude;
    }

2 단계. Yahoo API 와 같은 (Lat, Long)의 TimeZone API 중 일부에 (Long, Lat)을 인수로 제공 (플래그 R을 사용하여 Latitude를 Timezone으로 변환)하여 사용자 시간대를 얻습니다.

=> 사용자의 시간대는 사용자 입력없이 결정됩니다 (사용자가 자신이 살고있는 장소의 시간대를 알고 있다고 가정 할 수 없기 때문에 이것을 사용하고 있습니다. 몇 달 후에야 내 시간대를 알았거나 그 장소에서 무언가를 알았습니다 : P, 꽤 바보! )

각 이벤트 테이블에는 Timezone, Event&가 있으므로 s를 CityName 기반으로 분류하여 다른 데이터베이스 테이블을 만들 수도 있습니다 CityName. 여기에 사용자는 두 개의 열이 있습니다.

|---------------------------------------|
|_____NewYork________|______Sydney______|
|                    |                  |
|Event 1             |  Event 2         |
|____________________|__________________| 

UI 용

=> Google Calendar API 또는 일부 Calendar API 사용

관련 자료 :

  1. Geonames.org와 같은 웹 서비스를 사용하지 않고 위도 / 경도에서 시간대 결정

  2. 위도 경도에서 시간대 조회

이 문제를 해결하는 방법에 대한 아이디어를 보여주는 것만 알고 있습니다. 하지만 기기 API 를 사용하여 시간대를 결정할 때 사용자에게 얼마나 정확하고 가벼워 지는지 확인하세요.

도움이 되었기를 바랍니다.


4
지리적 위치없이 누군가의 시간대를 찾는 것은 매우 쉽습니다. new Date().getTimezoneOffset()UTC보다 몇 분 뒤에 제공됩니다.
Ry-

@minitech, 사실이지만 이벤트가 NewYork 및 동일한 시간대의 남쪽 어딘가에서 발생하면 어떻게 될까요? 나는 Geolocation을 사용하여 City (심지어 정확한), Timezone을 oneshot에서 찾아 내 DB 테이블을 기반으로 할 수 있습니다. 앱의 효율성을 높이기 위해 장치 API 를 사용하여 사용자 입력을 최소화하고 싶습니다 .
uday

그래서? 시간은 두 곳 모두 동일하므로 문제가 없습니다. -1
Ry-

@minitech, 다른 방법보다 장치 API 사용을 권장하는 이유에 대한 링크를 볼 수 있습니다 . webdirections.org/sotmw2011
uday

2
좋아요.하지만 여기서 문제는 사용자의 도시를 얻는 것이 아닙니다. 그것은 시간대를 얻는 것에 관한 것입니다. 모든 브라우저 / 컴퓨터에서 작동하지 않는 위치 정보 API를 사용한 다음 캘린더 API로 리디렉션하는 것은 한 줄의 코드에서 사용할 수있는 사용자의 시간대를 가져 오는 잘못된 방법 입니다.
Ry-

2

이 특별한 경우에는 현지 시간과 UTC 시간을 모두 저장 합니다 . UTC는 다소 중요하며 시간을 현재 시간대로 동기화하고 변환하는 데 사용됩니다. 로컬은 다음과 같은 검색 및 추가 정보에 사용됩니다.

회의가 있습니다.

12:00 Monday (UTC)
9:00 Monday (Sydney, creation local time)
11:00 Monday (Zurich, local time)

또는 그런 것. 다른 방법은 생성 시간대를 저장하고 런타임에 변환하는 것입니다 (사용자가 회의 시간을 변경할 경우 특히 더 좋습니다). 어느 쪽이든 주된 이유는 사용자가 참조 할 수 있도록 원래 생성 시간을 복원 할 수 있기 때문입니다.


2
  1. 데이터베이스에 타임 스탬프를 저장하려면 어떻게해야합니까?

이벤트 생성시 UTC 시간과 현지 시간대 (일명 creation time zone)를 저장합니다. 내가 저장 한 것을 사용하여 UTC 시간을 현지 시간 (일명 creation time) 으로 변환 하고 UTC 시간과 함께 저장합니다 creation time zone.

참고 : 처음부터 현지 시간을 저장할 수 있지만 사용자가 이벤트를 검색 할 때 현지 시간으로의 변환이 존재하기를 바랍니다. 또한 서버가 클라이언트가있는 시간대를 감지 할 수 있기를 바랍니다.

  1. UI에 어떻게 표시해야합니까?

"9시"에 대한 사용자 검색, 나는 UTC 중 하나에 "9:00"등 이벤트를 검색 할 때 OR creation time 또는 현지 시간. 결과를 위해 하나의 결과 테이블 creation time을 표시합니다 (사용자가 어디에서 이벤트를 생성했는지를 사용자가 찾고 있다고 가정하므로 다른 시간대에서 생성되었을 수있는 타임 스탬프를 표시하기위한 것입니다). 을 클릭하고 관련 결과와 함께 아래에 두 번째 결과 테이블을 표시합니다. 아마도 "찾고있는 항목이 아닙니까? 관련 결과보기"(여기에는 남은 UTC 및 현지 시간 결과 포함)라는 헤더가 포함됩니다.

전반적으로 UTC 시간, 현지 시간, creation timecreation time zone(즉, 이벤트가 생성 된 이벤트의 현지 시간 및 시간대)를 UTC 시간별로 정렬하여 표시하므로 두 가지 다른 경우에 어떤 이벤트가 먼저 오는지 확인할 수 있습니다. 이벤트는 두 개의 다른 시간대에서 9:00로 예약되었습니다.


1
+1 현지 시간이 일치하는 모든 시간대의 모든 이벤트를 표시하는 아이디어가 마음에 듭니다. SQL (24x BETWEEN조건)에 만족하지 않습니다 .
Aaron Digulla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.