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

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

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

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

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

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

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

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

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

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



답변

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

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

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

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


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

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

답변

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

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

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

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

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

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


답변

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

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

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

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

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

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


답변

여기에서는 구현 가능성에 대해 크게 신경 쓰지 않고 최상의 유용성을 제안합니다.
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 및 기본 시간대의 타임 스탬프를 볼 수 있습니다.

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


답변

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

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

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

  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 를 사용하여 시간대를 결정할 때 사용자에게 얼마나 정확하고 가벼워 지는지 확인하세요.

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


답변

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

회의가 있습니다.

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

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


답변

  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로 예약되었습니다.