사용자 시간대 결정


610

웹 서버가 웹 페이지 내에서 사용자의 시간대를 결정할 수있는 표준 방법이 있습니까?

아마도 HTTP 헤더 또는 user-agent문자열의 일부 입니까?


6
사용자에게 물어보십시오. 사용자 컴퓨터에서 시간대를 가져 와서 잘못 설정 한 경우 어떻게됩니까?
Rob Williams

40
그렇다면 사용자는 신경 쓰지 않습니까?
agnoster

2
당신은 의미합니까 stackoverflow.com/q/1091372/218196 ?
Felix Kling

2
불행하게도,이 질문에 대한 답변은 또한 사용자 프로파일 링 및 지오 펜싱을 허용합니다.
윌리엄 Entriken

1
왜 사용자 시간대를 알아야합니까?
Braiam

답변:


326
-new Date().getTimezoneOffset()/60;

이 방법 getTimezoneOffset()은 GMT에서 시간을 빼고 분을 반환합니다. 따라서 GMT-8에 거주하면 480을 반환합니다.

이것을 시간으로 나누려면 60으로 나눕니다. 또한 부호는 필요한 것과 반대입니다. 즉 표준 시간대의 GMT 오프셋이 아니라 표준 시간대의 GMT 오프셋을 계산합니다. 이 문제를 해결하려면 -1을 곱하면됩니다.

또한 w3school 은 다음과 같이 말합니다.

일광 절약 시간제를 사용하기 때문에 반환 값이 상수가 아닙니다.


5
자바 스크립트를 지원하지 않는 브라우저가있는 휴대 전화를 사용하는 사용자는 어떻습니까? 나는 사용자가 HTTP 헤더, 사용자 에이전트에 대해 묻는 질문을 좋아한다.이 작업 서버를 가능한 한 정확하게 만드는 방법이 있습니까?
Nischal

18
DST에서는 항상 작동하지 않습니다. 시간대 오프셋 가져 오기 기능은 정확히 말합니다. 오프셋입니다. 시간대는 실제로 지리적 영역입니다. 사용자가 어느 반구에 거주하는지 또는 해당 국가의 일광 절약 시간을 알지 못하기 때문에 일광 절약 시간에는 효과가 없습니다. 대신 이것을 사용하지 않는 이유 :>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Keyo

20
나는 Keyo와 다른 것을 간청합니다. ECMA 표준 ecma-international.org/ecma-262/5.1/#sec-15.9.5.26 에 따라 getTimezoneOffset ()의 정의 는 "현지 시간과 UTC 시간의 차이를 분 단위로 반환합니다." 즉, 일광 절약 시간을 고려해야합니다. 모질라의 문서에 따르면 "일광 절약 시간은이 값이 특정 로케일에서도 일정하지 않게합니다."
xgretsch

11
@xgretsch : GMT에서 사용자의 현재 오프셋을 가져옵니다 . 같은 날에 발생하는 다른 시간을 제시한다면 괜찮습니다 (현재 날짜가 전환 날짜가 아닌 경우에는 틀릴 수 있습니다). 그러나 GMT와 동일한 오프셋을 갖는 시간대가 많으며 전환 날짜가 다르거 나 일광 절약 시간을 사용하지 않을 수 있습니다.
Mike Dimmick

12
여기서 주목할 것은 일부 지역 (캐나다의 뉴 펀들 랜드와 같은)에는 30 분 가량의 시간대가 있으므로 60으로 나눈 후에는 정수가 아닐 수 있습니다.
Jason Walton

193

내가 본 시간대를 결정하는 가장 인기있는 (== 표준?) 방법은 단순히 사용자에게 묻는 것입니다. 웹 사이트에 가입이 필요한 경우 사용자의 프로필 데이터에 저장 될 수 있습니다. 익명 사용자의 경우 날짜는 UTC 또는 GMT 등으로 표시 될 수 있습니다.

나는 스마트 알렉이 되려고 노력하고 있지 않다. 때로는 일부 문제가 프로그래밍 컨텍스트 외부에서 더 나은 솔루션을 가지고 있다는 것입니다.


5
사용자가 자신의 위치에 맞는 시작 시간을 가져야하는 .ics 파일을 다운로드 할 때는 어떻습니까 (예 : 오전 9-11시 전국)? 그들은 그들의 시간대가 imo라고 말해서는 안됩니다.
Marcy Sutton

33
@Ishmaeel : 그러나 국제적으로 여행하는 사용자는 자국이 아닌 시간대에서 로그인 할 때마다 시간대를 알려줄 필요가 없습니다
Rajat Gupta

10
이것은 그 질문에 대한 답이 아니며, 그가 기술적 해결책을 찾고 있음을 분명히 나타냅니다.
G-Wiz

5
@gWiz OP는 표준 솔루션을 요구하고 있습니다. 이것은 꽤 표준입니다.
Simon Bergot

4
가장 좋은 해결책은 아마도 사용자에게 요청하는 것 (예 : 보고서 상단에 시간대 드롭 다운 제공)과 함께 사용자가 모바일에있을 때 GPS 결정 시간대로 기본적으로 드롭 다운 선택을하는 것입니다. 위치 정보를 제공하는 장치이며 그렇지 않은 경우 기본값은 UTC입니다.
Triynko

132

HTTP 스펙에 포함하도록 제안되었지만 클라이언트 시간대를 지금까지보고 할 HTTP 헤더는 없습니다.

그것이 있다면 클라이언트 측 JavaScript를 사용하여 시간대를 가져 와서 Ajax 또는 다른 것을 사용하여 서버에 제출하려고합니다.


16
이상하게도 이것은 질문에 대한 유일한 정답 이며 서버 측에서 수행하는 방법을 묻습니다. 더 많은 투표로 다른 답변이있는 이유는 클라이언트 측에서해야한다는 것을 알게되면 다른 답변을 사용하기 때문입니다. 그러나 다른 답변을 찬성하는 사람은 이것도 찬성해야합니다.
TTT

가장 좋은 방법은 geo-ip 위치를 사용하여 가능한 시간대를 정렬하고 기본적으로 사용자 에이전트 시간 오프셋 (자바 스크립트 필요)과 일치하는 첫 번째 시간대를 선택하는 것입니다. 그 후에도이 방법으로도 잘못된 시간대를 선택하면 시간대를 수정하는 방법을 제공해야합니다.
Mikko Rantalainen

@MikkoRantalainen 프록시를 사용할 때 항상 헤더에 광고하는 것은 아니기 때문에주의해야합니다.
Matthieu

@ Matthieu 요즘 더 나은 대답이 있습니다 : stackoverflow.com/a/11836123/334451
Mikko Rantalainen

2
이것은 실제로 제기 된 문제를 해결 한 유일한 대답입니다.
lscoughlin

54

JavaScript는 클라이언트의 현지 시간을 얻는 가장 쉬운 방법입니다. XMLHttpRequest 를 사용 하여 로컬 시간을 다시 보내도록 제안하고, 실패하면 IP 주소를 기반으로 감지 된 시간대로 폴백합니다.

지리적 위치에 관해서 는 여러 프로젝트에서 MaxMind GeoIP 를 사용 했으며 시간대 데이터를 제공하는지 확실하지 않지만 잘 작동합니다. 귀하가 비용을 지불하는 서비스이며 데이터베이스에 대한 월별 업데이트를 제공합니다. 여러 웹 언어로 래퍼를 제공합니다.


GeoIP (현재 사용 가능한 무료 버전이 있음)와 같은 데이터베이스에서 얻은 위도와 경도를 이러한 좌표를 표준 시간대로 변환하는 데이터베이스와 결합 할 수 있기 때문에이 답변에 투표했습니다. GeoNames에는 후자의 데이터베이스가 있다고 생각합니다.
Peter O.

MaxMind GeoIP 데이터베이스 / API의 현재 버전 (무료 및 유료)은 실제로 시간대 정보를 제공합니다 (내 시간대에 대해 "유럽 / 런던"을 반환 함). 이전 버전의 GeoIP 시스템인지 여부를 기억할 수 없습니다 똑같이했지만 지금은 잘 작동합니다! MaxMind 필드의 이름은 "time_zone", "time_zone_name"입니다.
Matthew Slyman

51

먼저 JavaScript에서 시간대 감지가 불완전하다는 것을 이해하십시오. 객체 의 인스턴스를 사용하여 특정 날짜 및 시간에 대한 현지 시간대 오프셋 을 가져올 수 있지만 이는 같은 전체 IANA 시간대 와 동일하지 않습니다 .getTimezoneOffsetDateAmerica/Los_Angeles

그래도 작동 할 수있는 몇 가지 옵션이 있습니다.

const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tzid);

결과는 코드가 실행중인 컴퓨터의 IANA 시간대 설정이 포함 된 문자열입니다.

지원되는 환경은 Intl 호환성 표에 나열 되어 있습니다. 확장 DateTimeFormat섹션 및 명명 된이 기능을보고 resolvedOptions().timeZone defaults to the host environment.

  • Luxon 과 같은 일부 라이브러리 는이 API를 사용하여와 같은 기능을 통해 시간대를 결정합니다 luxon.Settings.defaultZoneName.

    • 구형 웹 브라우저와 같이보다 광범위한 환경을 지원해야하는 경우 라이브러리를 사용하여 시간대에 대한 정확한 추측 을 할 수 있습니다. Intl사용 가능한 경우 먼저 API를 시도하여 사용할 수 있으며, 사용 가능하지 않은 경우 결과를 사용하여 내부 데이터 세트에서 적절한 시간대를 선택하여 여러 시점에서 오브젝트 의 getTimezoneOffset기능을 조사합니다 Date.

    jsTimezoneDetect순간 시간대는 이 기능을 가지고있다.

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();

    두 경우 모두 결과는 추측으로 만 생각할 수 있습니다. 대부분의 경우 추측이 정확할 수 있지만 전부는 아닙니다.

    또한이 라이브러리는 많은 오래된 JavaScript 구현이 현지 시간대 의 현재 일광 절약 시간제 규칙 만 알고 있다는 사실을 막기 위해 정기적으로 업데이트해야 합니다. 자세한 내용은 여기를 참조하십시오.

궁극적으로 더 나은 방법은 실제로 사용자에게 시간대를 요청하는 것입니다. 변경할 수있는 설정을 제공하십시오. 위의 옵션 중 하나를 사용하여 기본 설정 을 선택할 수 있지만 앱에서 해당 설정을 벗어날 수는 없습니다.

사용자 컴퓨터의 시간대 설정에 전혀 의존 하지 않는 완전히 다른 접근법도 있습니다 . 대신 위도 및 경도 좌표를 수집 할 수있는 경우 다음 방법 중 하나를 사용하여 해당 좌표를 표준 시간대로 해결할 수 있습니다 . 이것은 모바일 장치에서 잘 작동합니다.


시간대를 추론하기 위해 사용자의 지리적 위치 (예 : 로케일)를 사용하는 것도 결함이 있습니다. 사용자는 자신의 기기에서 현지 시간대가 아닌 특정 시간대를 사용하고 싶을 수도 있습니다. 심지어 동일한 시간대가 표시 될 수도 있다고 생각했습니다. 예를 들어 여행자는 시간대를 보통 지역으로 설정 한 상태로 장치를 떠나는 경우가 많으며, 날짜와 시간이 별도의 조언없이 사용되지 않을 것으로 예상합니다. 나는 개인적인 경험에서 여기에서 이야기하고 있을지도 모른다… ;-)
RobG

롭을 트롤링하고 있는지 알 수 없습니다. ;) 그러나 이러한 접근법 중 어느 것도 그들의 로케일을 사용하지 않고 오히려 장치의 설정을 사용하므로 요점에 맞습니다. (마지막 단락에서 언급 된 대체 방법 만 현재 위치를 사용합니다.)
Matt Johnson-Pint

"로케일"이라는 용어 는 사용자의 지리적 위치가 아닙니다 . "로케일"은 언어, 숫자 형식, 달력 등과 같은 설정 그룹입니다. 예를 들어, de_DE 로케일은 독일어를 기본 언어로, 유로를 기본 통화로, 쉼표를 소수점 구분 기호로, 마침표를 천 단위 구분 기호로, 기간을 그레고리 어로 지정합니다. 달력으로. 참조 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
azernik

49

다음은 브라우저의 시간대를 결정하는 강력한 JavaScript 솔루션입니다.

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

부록 1 : 이제이 프로젝트는 GitHub에 있습니다 : https://github.com/pellepim/jstimezonedetect


14
링크 만 사라지면 답변이 유용하지 않기 때문에 링크 만 답변을 사용하지 않는 것이 좋습니다. 그리고 링크를 따르지 않으면 독자가 좋은 답변을 제공하는지 알 수 없기 때문입니다. 이 경우 데이터베이스 기반의 식별 방법을 사용하는 타사 라이브러리임을 명확히하고 작동 원리 중 일부를 설명 할 수 있습니다.
IMSoP

1
이! 이것은 갈 길입니다. 간단한 라이브러리, DST를 올바르게 처리합니다. 다른 답변은 WTF로 가득 차 있으며 많은 사람들이 DST를하지 않습니다.
Dirbaio

1
이 라이브러리는 매우 영리합니다. UTC에 대한 현재 오프셋을 쿼리 한 다음 UTC에 오프셋이 변경 될 때까지 초를 추가하거나 빼서 JavaScript Date 객체 시간을 조정하여 작동합니다. 이 방법을 사용하여이 라이브러리는 시간대를 고유하게 식별하기에 충분한 DST 변경을 충분히 파악합니다. 선형 검색 대신 이진 검색을 수행하면 라이브러리의 성능이 훨씬 향상 될 수 있다고 생각합니다. 반환 값은 IANA 영역 정보 키 (일명 Olson 시간대 데이터베이스)입니다.
Mikko Rantalainen

3
이 라이브러리는 더 이상 필요하지 않습니다. 최신 브라우저는 IANA 시간대 문자열을 반환하는 Intl API를 지원합니다. 이 답변을 참조하십시오 .
Dan Dascalescu 5

42

더 완벽한 방법이 있습니다.

  1. 사용자의 시간대 오프셋을 가져옵니다
  2. 일광 절약 경계에서 며칠을 테스트하여 일광 절약을 사용하는 영역에 있는지 확인하십시오.

발췌는 다음과 같습니다.

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    // Go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        // To ignore daylight saving time look for the lowest offset.
        // Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

JS에서 TZ 및 DST 가져 오기 (Way Back Machine을 통해)


이것은 나를 위해 일했다! 코드에 대한 몇 가지 업데이트에 대해서는 블로그 게시물 아래의 주석을 읽으십시오.
arlomedia

여전히 표준 시간대 의 표준 오프셋 ( 예 : +02 : 00) 만 반환합니다 . 그것은 당신에게 결정하기에 충분한 정보를 제공하지 않습니다 시간대 와 같은 사용자의 Africa/Johannesburg또는 Europe/Istanbul. 시간대 태그 위키를 참조하십시오 .
Matt Johnson-Pint

32

Unkwntech의 접근 방식을 사용하여 jQuery와 PHP를 사용하여 함수를 작성했습니다. 이것은 테스트되고 작동합니다!

시간대를 변수로 사용하려는 PHP 페이지에서 페이지 상단 근처에 다음 코드 스 니펫을 배치하십시오.

<?php
    session_start();
    $timezone = $_SESSION['time'];
?>

이제 세션 변수 "time"을 읽을 것입니다.

동일한 페이지의 <head>에서 먼저 jQuery를 포함해야합니다.

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

또한 jQuery 아래의 <head>에서 다음을 붙여 넣으십시오.

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://example.org/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

눈치 채 셨을지도 모르지만 URL을 실제 도메인으로 변경해야합니다.

마지막 한가지. 당신은 아마도 heck timezone.php가 무엇인지 궁금 할 것입니다. 글쎄, 그것은 간단합니다 : ( timezone.php 라는 새 파일을 만들고 위의 URL로 가리 킵니다)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

올바르게 작동하면 먼저 페이지를로드하고 JavaScript를 실행 한 다음 페이지를 다시로드합니다. 그러면 $ timezone 변수를 읽고 즐거움을 누릴 수 있습니다! 현재 UTC / GMT 표준 시간대 오프셋 (GMT -7) 또는 현재 시간대를 반환합니다.


나는 이것을 좋아하지만 현재 $ _SESSION [ 'time']을 확인하고 다른 경우에만 다시로드 할 자바 스크립트를 얻는 무언가를 가질 수 있습니다.
Christopher Chase

1
PHP 세션을 잠그고 직렬화 해제하면 앱이 느려질 수 있으므로 세션보다 쿠키를 사용하는 것이 더 쉽습니다. 효율성을 극대화하기 위해 값을 세션에 복사하고 쿠키를 삭제하여 후속 요청에서 전송되지 않도록 할 수 있습니다.
IMSoP

25

jQuery를 사용 하여 AJAX 요청에서 표준 시간대 오프셋을 HTTP 헤더로 제출하려면

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/moment.tz.guess(); 에서 사용하여 실제 시간대 이름을 얻는 것과 비슷한 작업을 수행 할 수도 있습니다 .


1
이 단지 반환 현재 이 아닌 - 오프셋 시간대 시간대를 . 시간대 태그 위키를 참조하십시오 .
Matt Johnson-Pint

표준 시간대 이름에 대한 정보를 포함하도록 편집되었습니다.
philfreo

24

나는 여전히 시간대를 얻는 자세한 답변을 보지 못했습니다. IP 주소로 지오 코딩하거나 PHP (lol)를 사용하거나 오프셋을 잘못 추측 할 필요가 없습니다.

첫째, 시간대는 GMT와의 오프셋이 아닙니다. 시간 규칙이 현지 표준에 의해 설정되는 토지 영역입니다. 일부 국가에서는 일광 절약 시간제를 사용하며 다른 시간에 DST를 켤 것입니다. 일반적으로 현재 오프셋뿐만 아니라 실제 영역을 얻는 것이 중요합니다.

이 시간대를 저장하려는 경우 (예 : 사용자 환경 설정) 오프셋뿐만 아니라 해당 영역을 원합니다. 실시간 전환에는 별 문제가되지 않습니다.

이제 자바 스크립트로 시간대를 얻으려면 다음을 사용할 수 있습니다.

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

그러나 Olsen 형식의 시간대를 반환하는이 강력한 플러그인을 사용하는 것이 더 쉽다는 것을 알았습니다.

https://github.com/scottwater/jquery.detect_timezone


22

PHP date기능을 사용하면 사이트가 위치한 서버의 날짜 시간을 얻을 수 있습니다. 사용자 시간을 얻는 유일한 방법은 JavaScript를 사용하는 것입니다.

그러나 사이트에 등록이 필요한 경우 사용자에게 필수 필드로 등록하도록 요청하는 것이 가장 좋습니다. 등록 페이지에 다양한 시간대를 나열하고 데이터베이스에 저장할 수 있습니다. 그런 다음 사용자가 사이트에 로그인하면 사용자가 선택한 시간대에 따라 해당 세션의 기본 시간대를 설정할 수 있습니다.

PHP 기능을 사용하여 특정 시간대를 설정할 수 있습니다 date_default_timezone_set . 사용자의 지정된 시간대를 설정합니다.

기본적으로 사용자 시간대는 클라이언트쪽으로 이동하므로 JavaScript를 사용해야합니다.

다음은 PHP 및 JavaScript를 사용하여 사용자 시간대를 가져 오는 스크립트입니다.

<?php
    #http://www.php.net/manual/en/timezones.php List of Time Zones
    function showclienttime()
    {
        if(!isset($_COOKIE['GMT_bias']))
        {
?>

            <script type="text/javascript">
                var Cookies = {};
                Cookies.create = function (name, value, days) {
                    if (days) {
                        var date = new Date();
                        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                        var expires = "; expires=" + date.toGMTString();
                    }
                    else {
                        var expires = "";
                    }
                    document.cookie = name + "=" + value + expires + "; path=/";
                    this[name] = value;
                }

                var now = new Date();
                Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
                window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
            </script>

            <?php

        }
        else {
          $fct_clientbias = $_COOKIE['GMT_bias'];
        }

        $fct_servertimedata = gettimeofday();
        $fct_servertime = $fct_servertimedata['sec'];
        $fct_serverbias = $fct_servertimedata['minuteswest'];
        $fct_totalbias = $fct_serverbias  $fct_clientbias;
        $fct_totalbias = $fct_totalbias * 60;
        $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
        $fct_time = time();
        $fct_year = strftime("%Y", $fct_clienttimestamp);
        $fct_month = strftime("%B", $fct_clienttimestamp);
        $fct_day = strftime("%d", $fct_clienttimestamp);
        $fct_hour = strftime("%I", $fct_clienttimestamp);
        $fct_minute = strftime("%M", $fct_clienttimestamp);
        $fct_second = strftime("%S", $fct_clienttimestamp);
        $fct_am_pm = strftime("%p", $fct_clienttimestamp);
        echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
    }

    showclienttime();
?>

그러나 내 관점에 따르면 프로젝트에 등록이 필수인지 사용자에게 묻는 것이 좋습니다.


22

IP 주소를 사용하여 위치 (및 시간대)를 명확하게 결정하지 마십시오. NAT, 프록시 (증가) 및 VPN의 경우 IP 주소가 사용자의 실제 위치를 반드시 현실적으로 반영 할 필요는 없지만 이러한 프로토콜을 구현하는 서버가 상주합니다.

번호 이동성의 인기로 인해 미국 지역 코드가 더 이상 전화 사용자를 찾는 데 유용하지 않은 방식과 유사합니다.

위에 표시된 IP 주소 및 기타 기술 은 사용자가 조정 / 수정할 수 있는 기본값제안하는 데 유용 합니다.


21

자바 스크립트 :

function maketimus(timestampz)
{
    var linktime = new Date(timestampz * 1000);
    var linkday = linktime.getDate();
    var freakingmonths = new Array();

    freakingmonths[0]  = "jan";
    freakingmonths[1]  = "feb";
    freakingmonths[2]  = "mar";
    freakingmonths[3]  = "apr";
    freakingmonths[4]  = "may";
    freakingmonths[5]  = "jun";
    freakingmonths[6]  = "jul";
    freakingmonths[7]  = "aug";
    freakingmonths[8]  = "sep";
    freakingmonths[9]  = "oct";
    freakingmonths[10] = "nov";
    freakingmonths[11] = "dec";

    var linkmonthnum = linktime.getMonth();
    var linkmonth = freakingmonths[linkmonthnum];
    var linkyear = linktime.getFullYear();
    var linkhour = linktime.getHours();
    var linkminute = linktime.getMinutes();

    if (linkminute < 10)
    {
        linkminute = "0" + linkminute;
    }

    var fomratedtime = linkday + linkmonth + linkyear + " " +
                       linkhour + ":" + linkminute + "h";
    return fomratedtime;
}

이 기능에 시간을 Unix 타임 스탬프 형식으로 제공하십시오. JavaScript는 이미 사용자의 시간대를 알고 있습니다.

이처럼 :

PHP :

echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';

이것은 항상 사람이 자신의 컴퓨터 시계에 설정 한 시간대를 기준으로 시간을 정확하게 표시합니다. 아무에게도 물어볼 필요가 없으며 장소에 저장하십시오. 하느님 감사합니다!


$ unix_timestamp_ofshiz? 비록 이것이 좋은 대답이 될 것 같지만 여기에 뭔가 빠졌고 제대로 작동하지 않습니다.


19

모든 마법이

visitortime.getTimezoneOffset()

멋지다, 나는 그것에 대해 몰랐다. Internet Explorer 등에서 작동합니까? 거기에서 JavaScript를 사용하여 Ajax에 쿠키를 설정할 수 있습니다. 아마도 쿠키 루트를 직접 방문했을 것입니다.

사용자가 변경할 수 있도록해야합니다. 우리는 지오 로케이션 (maxmind를 통해)을 사용하여 얼마 전에이 작업을 수행하려고했지만 합리적으로 자주 잘못되었습니다. 그럴만한 가치가 없었기 때문에 사용자가 자신의 프로필에서 설정하도록하고 아직 설정하지 않았습니다.


15

다음은 ASP.NET (VB.NET, C #) 응용 프로그램에서 현지화 된 시간을 확인하고 사용하는 방법을 설명하는 문서 (소스 코드 포함)입니다.

그것은 시간에 관한 것입니다

간단히 말해서, 설명 된 접근 방식은 JavaScript getTimezoneOffset쿠키 에 의존합니다. JavaScript 함수는 세션 쿠키에 저장되고 GMT와 로컬 시간 사이의 시간 값을 조정하기 위해 코드 숨김에서 사용되는 값을 리턴합니다. 좋은 점은 사용자가 시간대를 지정할 필요가 없다는 것입니다 (코드가 자동으로 수행함). 더 관련이 있지만 (이것이 기사에 링크 된 이유입니다) 제공되는 코드를 사용하면 실제로 사용하기가 쉽습니다. ASP.NET을 이해하는 한 논리를 PHP 및 다른 언어로 변환 할 수 있다고 생각합니다.


1
연결이 끊어졌습니다. 나는 이것이 대안적인 링크라고 생각한다 : devproconnections.com/article/aspnet2/it-s-about-time-122778
Gan

1
이 기사는 PDF 형식으로도 제공됩니다 : app.box.com/shared/bfvvmidtyg
Ivaylo Slavov

이 문서에서 설명하는 UTC 서버 시간을 로컬 클라이언트 시간으로 변환하는 방법이 잘못되었습니다. 현재 클라이언트 오프셋을 사용하여 서버에서 UTC 시간을 조정하면 일광 절약 시간을 준수하는 클라이언트 로캘의 경우 반년 동안 "로컬"시간이 잘못됩니다. 이 시나리오를 고려하십시오. 2013 년 1 월 14 일 영국의 클라이언트 (GMT + 0000 표준시)는 2015 년 8 월 21 일 14:00 (GMT + 0100 일광 절약 시간)의 날짜와 시간을 설정합니다. 이것은 서버에서 2015 년 8 월 21 일 13:00 UTC로 정규화됩니다. 이 날짜에 클라이언트 오프셋이 0이므로 클라이언트로 다시 전송되는 시간은 2015 년 8 월 21 일 13:00입니다.
Stephen Blair

유효한 요점이지만, 이것이 방탄 솔루션이라고 주장하지는 않았습니다. 기차표 예약 애플리케이션과 같이 시간에 민감한 솔루션을 구현해야하는 경우보다 포괄적이고 복잡한 솔루션을 찾아야합니다. 그러나 많은 앱의 경우 문제가되지 않습니다. 많은 경우에 현재 세션에 대한 GMT 값을 현지화하려고합니다. 이제 미래에도 일부를 위해 타임 스탬프를 저장해야하는 애플리케이션이 있고 DTS를 허용 할 수없는 경우 GMT에서 직접 시간을 절약 할 수있는 옵션을 제시하는 것이 좋습니다. 더 나은 옵션을 알고 있다면 공유하십시오.
Alek Davis

14

인증에 OpenID 를 사용하는 경우 Simple Registration Extension 은 인증 된 사용자의 문제를 해결합니다 (tz에서 숫자로 변환해야 함).

다른 옵션은 사용자 에이전트의 국가 환경 설정에서 시간대를 유추하는 것입니다. 이것은 다소 조잡한 방법이지만 (en-US에서는 작동하지 않음) 근사치가 좋습니다.


13

JavaScript와 PHP로 간단합니다 :

사용자가 자신의 내부 시계 및 / 또는 시간대를 망칠 수 있지만 오프셋을 얻기 위해 지금까지 찾은 가장 좋은 방법은 남아 있습니다 new Date().getTimezoneOffset();. 비 침습적이며 두통을 유발하지 않으며 타사에 의존 할 필요가 없습니다.

유닉스 타임 스탬프를 저장하기위한 users필드를 포함 하는 테이블이 있다고 가정 date_created int(13)하자.

클라이언트를 가정하면 creates a new account, 데이터가 수신되고 post, 내가 필요 클라이언트의 유닉스 타임 스탬프가 아닌 서버와.insert/updatedate_created column

삽입 / 업데이트시 timezoneOffset이 필요하므로 클라이언트가 양식을 제출할 때 추가 $ _POST 요소로 전달되므로 세션 및 / 또는 쿠키에 저장할 필요가 없으며 추가 서버 적중도 없습니다.

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;

서버가 다음 tzo과 같이 수신한다고 가정하십시오 $_POST['tzo'].

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);

삽입 / 업데이트 date_created=$user_timestamp.

date_created를 검색 할 때 다음과 같이 타임 스탬프를 변환 할 수 있습니다.

$date_created = // Get from the database
$created = date("F j, Y, g:i a",$date_created); // Return it to the user or whatever

이제이 예제는 first타임 스탬프 를 삽입 할 때 필요에 맞을 수 있습니다 . 추가 타임 스탬프 나 테이블에 대해서는 나중에 참조 할 수 있도록 tzo 값을 users 테이블에 삽입하거나 설정하는 것이 좋습니다. 세션 또는 쿠키로.

추신 : 사용자가 여행하고 시간대를 전환하면 어떻게됩니까? GMT + 4에 로그인하고 GMT-1로 빠르게 이동 한 후 다시 로그인합니다. 마지막 로그인은 앞으로있을 것입니다.

내 생각 엔 ... 우리는 너무 많이 생각합니다.



11

PHP에서 유효한 TZ 데이터베이스 시간대 이름을 얻는 것은 두 단계 프로세스입니다.

  1. JavaScript를 통해을 통해 분 단위로 시간대 오프셋을 가져옵니다 getTimezoneOffset. 이 오프셋은 현지 시간대가 UTC보다 뒤에 있으면 양수이고, 앞에 있으면 네거티브입니다. 따라서 오프셋에 반대 부호를 추가해야합니다.

    var timezone_offset_minutes = new Date().getTimezoneOffset();
    timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;

    이 오프셋을 PHP로 전달하십시오.

  2. PHP에서이 오프셋을 timezone_name_from_abbr 함수 를 사용하여 유효한 시간대 이름으로 변환하십시오 .

    // Just an example.
    $timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']
    
    // Convert minutes to seconds
    $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
    
    // America/Chicago
    echo $timezone_name;</code></pre>

나는 블로그 게시물을 작성했다 : PHP에서 사용자 시간대를 감지하는 방법 . 또한 데모가 포함되어 있습니다.


1
더 간단한 프로세스는 전화를 걸어 Intl.DateTimeFormat().resolvedOptions().timeZone웹 서버로 보내는 것입니다. 참조 : stackoverflow.com/questions/9772955/...
마이클라고 Tsang


8

가능한 옵션 중 하나 DateRFC 7231에 정의되어 있고 시간대를 포함해야하는 헤더 필드 를 사용하는 것 입니다. 물론 그 가치가 실제로 고객의 시간대라는 보장은 없지만 편리한 출발점이 될 수 있습니다.


1
불행하게도,이 헤더는 요청이 아닌 응답을 위해 주로 설계된 것 같습니다. 방금 확인했는데 Firefox에서 보내지 않습니다.
IMSoP

8

내가하는 방법은 다음과 같습니다. 이것은 PHP 기본 시간대를 사용자의 현지 시간대로 설정합니다. 모든 페이지 상단에 다음을 붙여 넣기 만하면됩니다.

<?php
session_start();

if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
        <script>
        var d = new Date()
        var offset= -d.getTimezoneOffset()/60;
        location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
        <?php   
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}

date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>

1
이것은 "일광 절약"조정을 설명하지 않습니다. 더블린 사용자는 겨울에는 '유럽 / 더블린'과 일치하지만 여름에는 '유럽 / 베오그라드'와 일치합니다. 현재 오프셋을 사용하려는 경우 지리적 식별자가 아니라 해당 오프셋 만 가정하면됩니다.
IMSoP

8

이 PHP 코드를 사용해보십시오 :

<?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=" . $ip . "&full=true");
    $json = json_decode($json,true);
    $timezone = $json['LocalTimeZone'];
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.