2012-05-07 3 views
0

사용자가 약속 날짜와 시간을 입력하고 그 전에 한 시간 전에 알림을 보내길 원합니다.javacript datetimepicker with local support

서버에서 날짜 - 시간을 UTC로 저장하고 싶지만 클라이언트에서는 사용자가 현지 시간으로 입력합니다. 이 전환을 처리하는 가장 좋은 방법은 무엇입니까? 기본적으로이를 지원하는 플러그인이 있습니까?

+0

유용한 정보 http://www.w3schools.com/js/js_obj_date.asp –

답변

2

예, 시스템 정보 (jsTimezoneDetect)에 따라 시간대를 감지하는 플러그인이 있습니다. 실제로는 date- 개체 자체가 정보를 저장합니다 (그러나 그것은 다소 wierdo입니다!).

읽을 가치가있는 interesting articlean interesting answer here on SO이 있습니다.

자바 스크립트에서 날짜 - 시간 계산을 수행하지 마십시오. 브라우저를 정의하기 위해 브라우저 시간대를 추측 할 수 있지만 정의 자체와 모든 날짜 - 시간 계산은 시간대를 인식하는 시스템에서 이루어져야합니다.

이 기사를 읽으면 "date/dst/utc/javascript의 시간대"문제에 대해 더 깊이 이해할 수 있습니다. 따라서 서버쪽에 대해 더 자세히 알려 주면 흥미로울 것입니다. :

  • 서버 측에서 어떤 프레임 워크를 사용합니까?
  • 일부 설정 (예 : 맞춤 시간대 설정)으로 계정을 다시 게시하기위한 논리가 있습니까?

"올바른"접근법 (백엔드가 뒤에 있으면 안전합니다)은 다음과 같습니다. 사용자가 datetime으로 작업하도록 허용 - 브라우저 범위에서 "정의되지 않음"(아니요 시간대, 오프셋 등을 찾아야합니다!). 이제이 "정의되지 않은"datetime 정보를 서버에 제공합니다 (예 : 서버에 숨김 필드와 함께 유닉스 타임 스탬프 보내기). 여기서 사용자가 할당 된 실제 시간대 정보를 얻을 수 있습니다. 이제이 "정의되지 않은"datetime-information을 서버 측의 표준 시간대를 인식하는 datetime-object로 변환하고 계정 범위의 정보를 여기에 할당 할 수 있습니다 (이제 "정의되지 않은"datetime-object에는 현지 시간이 있습니다) -zone - 예 : "Pacific Daylight Time"). 이제 원하는 변환을 쉽게 할 수 있습니다.
이 접근법의 유일한 단점은 표준 시간대 (사용자 OS와 웹 응용 프로그램의 OS)를 정의하는 2 가지 범위가 있다는 것입니다.하지만 다른 것은 아무 것도하지 않고 실수없이 안전합니다!

+0

흥미로운 포인터. 따라서 사용자를 정확하게 이해하면 날짜와 시간의 사용자 입력을 기준으로 에포크에서 정확한 밀리 초를 계산하는 서버에 숨겨진 필드를 보낼 수 있습니다. 한 가지 방법은 jsTimezoneDetect 파일을 사용하여 오프셋을 추가하는 것입니다. 새로운 날짜 (년, 월, 일,시, 분, 초, 밀리 초)를 수행하면 자동으로 불량을 처리합니까? –

+0

사실 ... 예!그것이 우리가 한 일입니다. 사용자에게 예를 들어 '2012-01-01 12:30:00'(ok ... 올바른 ... 문자열이 아니라 오히려 날짜 객체)라고 말하십시오. 이제 이것을 유닉스 타임 스탬프 (이 변환은 OS 설정에 달려있다)로 변환하고 서버로 보내서 ASP.NET에서와 같이'System.DateTime'으로 변환하고 "local"로 설정한다. 우리가 사용자 her// 자신으로부터 가지고있는 timeZone 정보. 이제 실제 UTC로 변환하고 원하는 모든 변환을 수행 할 수 있습니다. dateTime (항상 UTC로 저장 됨)을 표시해야하는 경우 표시 사용자의 로컬 값으로 변환합니다. –

0

서버에 타임 스탬프를 보내고 getTimezoneOffset 메서드를 사용하여 UTC 날짜/시간 클라이언트 측을 계산하는 것이 좋습니다. 다시 클라이언트 측으로 변환하려면 타임 스탬프를 보내고, 더미 날짜 클라이언트 측을 작성하여 (클라이언트가 다른 시간대로 이동할 수 있음) 소요 시간대 오프셋을 결정하고 해당 정보에서 클라이언트 측 날짜를 작성하십시오. 당신이 좋아하는 뭔가를 할 것 클라이언트 측 :

//[client side send] 
var d = new Date(), //now 
    offset = d.getTimezoneOffset() 
    UTCTimeStamp = d.getTime()+(60000*offset); // send to server 

//[client side receive] 
var offset = 60000*new Date().getTimezoneOffset(), 
    localDate = new Date(timestamp + (offset < 0 ? Math.abs(offset) : -offset)); 

Click here는이 아이디어를 사용하여 간단한 테스트를 할 수 있습니다.

+0

이것은 주요한 문제입니다. dst-timezone을 사용하는 경우 다른 날짜에 대한 다른 시간대 오프셋을 가져옵니다 (예 : 2012-01-01 +1, 2012-05-07 +2). 지금 ... "+2"는 dst가 있거나없는 시간대 일 수 있습니다 ... –

+0

btw -'.getTimezoneOffset()'의 결과는 분 단위입니다. –

+0

@Andreas : 내 대답에서 링크를 시도하십시오. 클라이언트는 내 서버에 UTC 타임 스탬프를 보내고 서버는 타임 스탬프를 반환하고 클라이언트 측 처리 시간은 클라이언트 시간대의 날짜/시간으로 반환합니다. – KooiInc