문제

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

아마에 HTTP 헤더의 일부 또는 user-agent 문자열?

올바른 솔루션이 없습니다

다른 팁

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

방법 getTimezoneOffset() 을 빼는 것입니다 당신의 시간에서 GMT 및 수 있습니다.그래서 당신은 라이브 GMT-8 이 반환됩니다 480.

이것을 넣어 시간,60 으로 나눕니다.또한,통지는 등록하십시오 반대로 무엇을 해야-그것은 계산 GMT 의 오프셋에서 시간이 지역은,당신의 시간대의 오프셋에서 GMT.이 문제를 해결하려면,단순히 곱하여-1 입니다.

또한 note w3school 말합니다:

반환된 값이 일정하지 않기 때문에 사용하는 방법 일광 절약 시간입니다.

가장 인기 있는(==표준?) 의 방법을 결정하는 표준 시간대 봤어요 주위에는 단순히 을 묻는 사용자를 나타냅니다. 귀하의 웹사이트에 가입이 필요합,이 저장될 수 있습에서 사용자의 프로필 데이터입니다.에 대한 사용자 익명 날짜음과 같이 표시될 수 있습니다 UTC 또는 GMT 니다.

내가 하려고 하지 똑똑한 체하는.그것은 단지 때로는 몇 가지 문제가 미세한 솔루션을 외부의 어떤 프로그래밍다.

이 없는 HTTP 헤더를 보고하고 클라이언트는 시간대를 지금까지 제안 되었습니다 비록 그것을 포함하는 HTTP 사양에 있습니다.

었다면,나는 것 아마도 가져오는 시간대를 사용하여 클라이언트 측 JavaScript 한 후 제출하여 서버를 사용하여 Ajax 또는 무언가이다.

자바 스크립트를 얻을 수있는 가장 쉬운 방법은 클라이언트는 로컬 시간입니다.는 것이 좋을 사용하여 XMLHttpRequest 을 다시 보낼 현지 시간,그리고 실패하는 경우,가을이 다시 시간대 감에 따라 자신의 IP 주소입니다.

로 위치 정보,사용 MaxMind GeoIP 프로젝트를 수행하고 그것을 작동하는지 내가 확실하지 않는 경우에 그들이 제공하는 시간대에 데이터입니다.그것은 서비스 당신에 대해 지불하고 그들이 제공하는 매월 업데이트를 귀하의 데이터베이스입니다.그들이 제공하는 포장지에서 여러 웹 언어입니다.

여기에 강력한 JavaScript 솔루션을 결정하는 표준 시간대의 브라우저입니다.

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

https://bitbucket.org/pellepim/jstimezonedetect

여기에 더 완전한 방법입니다.

  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;
}

을 받고 TZ 및 DST 에서 JS (를 통해 방법으로 다시 컴)

첫째,이해하는 시간 영역 검출에 자바 스크립트는 불완전합니다.을 얻을 수 있습컬 시간대 오프셋 특정 날짜와 시간을 사용하여 getTimezoneOffset 에서의 인스턴스 Date 체,하지만 같은 전체 IANA 시간대America/Los_Angeles.

거기에 몇 가지 옵션을 작동할 수 있는지:

  • 가장 현대적인 브라우저 지원 IANA 시간 영역에서의 구현 ECMAScript 국제화 API, 는,그래서 당신은 작업을 수행 할 수 있습니다:

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

    결과 문자열을 포함하는 IANA 시간대 설정을 컴퓨터의 코드를 실행합니다.

    지원되는 환경을 나열됩 에서 국제 표 호환성.확장 DateTimeFormat 섹션을 살펴보라는 기능 resolvedOptions().timeZone defaults to the host environment.

    • 일부 같은 라이브러리 을 갖추고 있을 이 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 구현만을 알 현재 일광 절약 시간에 대 한 규칙들은 현지 시간 영역입니다. 더 많은 정보에는 여기에.

궁극적으로,더 좋은 방법은 실제로 요청한 사용자는 자신의 시간의 영역입니다.제공하는 설정 변경할 수 있습니다.중 하나를 사용할 수 있습니다 위의 옵션을 선택하 기본 설정이지만,만들지 않는 것이 불가능에서 벗어나는 것에 있습니다.

있어도 완전히 다른 방식의 에 의존하는 표준 시간대 설정은 사용자의 컴퓨터에서 모두.대신,당신이 할 수있는 경우 수집하는 위도 경도 좌표를 해결할 수 있습니다 그리하면 시간을 사용하는 영역 다음 방법 중 하나.이 모바일 장치에서 잘 작동.

사용 Unkwntech 의 접근 방식은,나는 기능을 사용하여 jQuery 및 PHP.이 테스트 작업을 수행!

PHP 페이지 당신이 원하는 표준 시간대 변수로,이 코드를 어딘가에 근처의 최고의 페이지:

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

이 읽을 것이 세션 변수"시간"이는 우리가 지금 대해 만들 수 있습니다.

에는 동일한 페이지의 <head>당신이 모두 포함 jQuery:

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

도 <head>아래,jQuery,paste this:

<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 을 변경하는 실제 도메인입니다.

마지막 한 가지입니다.당신은 아마 도대체 무엇을 궁금해 하는 timezone.php 입니다.만,그것은 단순히 이:(라는 새로운 파일을 생성 timezone.php 고 지점으로 위의 URL)

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

는 경우 이를 제대로 작동하는것이 첫 번째는 페이지를로드,실행 자바 스크립트,그리고 페이지를 다시 로드합니다.당신은 다음을 읽을 수 있$시간대 변수를 사용하여 귀하의 기쁨!그것을 반환합니다 현재 UTC/GMT 시간대 오프셋(GMT-7)또는 어떤 시간에 있다.

나는 아직 보지 못한 대답을 여기에 가져오는 시간입니다.할 필요가 없을 지 IP 주소 또는 사용 PHP(웃음)또는 잘못 추측에서 오프셋이 있습니다.

첫째 시간대는 오프셋에서 GMT.그것은 지역의 토지는 시간을 규칙을 설정하여 local standards.일부 국가 있는 일광 절감 및 전환에 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

제출하는 표준 시간대 오프셋의 HTTP 헤더에 AJAX 요청 jQuery

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

할 수도 있습니다 비슷한 방법으로 실제 시간대 이름을 사용하여 moment.tz.guess();http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

로 PHP date 기능을 사용하면 날짜를 얻을 시간 서버에서는 사이트는 위치입니다.을 얻을 수있는 유일한 방법은 사용자의 시간을 자바스크립트를 사용한다.

그러나 나는 당신을 제안하는 경우,사이트 등록에 필요한 최선의 방법은 사용자가 가지고있는 동안 등록을 필수 필드입니다.할 수 있 목록 다양한 시간대에 등록 페이지에 저장되는 데이터베이스에서.이 경우,사용자 로그를 사이트에 당신은 설정할 수 있는 기본 표준 시간대에 대한 세션에 따라 사용자가 선택한 시간대.

당신은 설정할 수 있습니다 어떤 특정 시간대를 사용하는 기능 PHP date_default_timezone_set.이 설정은 지정된 시간대를 위한 사용자.

기본적으로 사용자의 시간대가 클라이언트 측면,그래서 우리는 자바 스크립트를 사용합니다.

아래 스크립트를 얻는 사용자의 시간대를 사용하여 PHP 및 자바 스크립트.

<?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();
?>

그러나 나의 관점,그것의 더 나은 요청하는 경우 사용자에게 등록에서 필수적입니다.

쉽고,사용 JavaScript getTimezoneOffset 함수는 다음과 같이

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

자바스크립트:

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 timestamp 형식이 기능JavaScript 이미 알고 있다고 시간대의 사용자.

다음과 같다:

PHP:

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

이것은 항상 시간에 올바르게 기반으로 시간대의 사람이 설정하에서 자신의 컴퓨터 시계입니다.할 필요가 없이 아무것도 요구하는 사람과 저장 장소,하나님 감사합니다!

의 모든 마법이 될 것으로 보인

visitortime.getTimezoneOffset()

임에 대해 알고하지 않았다.그것은 작동하는 Internet Explorer,etc.?거기에서 당신은 할 수 있어야한 자바 스크립트를 사용 Ajax,쿠키를 설정,어떤 것이다.나는 아마 갈 쿠키로 자신입니다.

해야 합니다 사용자가 변경할 수 있게 합니다 하지만 그것.우리는 시도를 사용하는 위치 정보(via maxmind)이 전,그리고 그것이 잘못되었다 합리적으로 종종-수 있도록 충분히 가치가있다,그래서 우리는 단지 사용자 설정에서 자신의 프로필을 보여 통지하는 사용자 설정하지 않은 그들의 것 아직입니다.

지 않는 IP 주소를 사용하여 결정적으로 위치를 결정(따라서 시간대)--그것 때문에 NAT,프록시(점점 더 인기가)및 Vpn,IP 주소를 반드시 사실적으로 반사하는 사용자의 실제 위치에,하지만 위치에 있는 서버를 구현하는 그 프로토콜 있습니다.

비슷하게 우리 지역 코드는 더 이상한 전화,사용자정의 인기는 수 휴대 가능이 있습니다.

IP 주소 및 기타 기술을 위에 표시된 유용한 안을 제안하는 기본값 는 사용자를 조정할 수 있/맞습니다.

당신이 사용하는 일이 OpenID 인증 간단한 등록 확장 는 것이 문제를 해결을 위해 인증된 사용자는(당신이 필요로 변환하 tz 숫자).

또 다른 옵션이 될 것이라 추론하는 시간 영역에서 사용자 에이전트의 국가니다.이는 다소 원 방법(작동하지 않습 en-US),하지만 좋은 근사입니다.

여기에 문서(소스 코드)설명하는 방법을 확인하고 사용하는 지역화된 시간에서 ASP.NET (VB.NET C#)응용 프로그램:

그것은 시간에 대해

즉,설명된 방법에 의존하 JavaScript getTimezoneOffset 함수를 반환하는 값은 저장한 세션에서 쿠키가 사용하여 코드를 조정 시간 사이의 값을 지 현지 시간입니다.좋은 것은 사용자를 지정할 필요가 없습 시간대(코드는 자).더 많은 참여(이에 대한 링크를 문서),만 제공하는 코드는 정말 사용하기 쉽습니다.내가 있는 것이 아닌가 생각하면으로 변환할 수 있는 논리를 PHP 와 다른 언어(만큼 당신이 이해 ASP.NET).

그것은 간단한 JavaScript and PHP:

비록 사용자가 엉망으로 그/그녀의 내부 클럭 그리고/또는 시간,최선의 방법은 내가 지금까지 발견을 얻기 위해 오프셋,남 new Date().getTimezoneOffset();.It's non-invasive,을 제공하지 않 머리 통증을 제거에 의존해야 하는 제삼자에게 있습니다.

가,테이블 users, 는 필드가 포함 date_created int(13), 을 위해,저장 Unix timestamp;

고 가정하면 클라이언트 creates a new account, 데이터 수신 post, 고 insert/updatedate_created column 클라이언트의 Unix timestamp,서버가 아니다.

이 표준 시간대 오프셋이 필요한 시간에 삽입 업데이트/그로 전달되는 추가$_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_modified,변환할 수 있습니다 타임 스탬프 이렇게:

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

지금 이 예제에 맞게 수 있습니다 하나의 요구에 올 때,삽입 first timestamp...에 올 때는 추가적인 타임스탬프,또는 테이블을 고려할 수 있습니다 삽입하는 이 값을 사용으로 사용자의 테이블이 미래에 대한 참조,또는 설정으로 세션으로 또는 쿠키입니다.

P.S.하지만 어떤 경우에는 사용자와 스위치에 연결됩니다.로그에서 GMT+4,빨리 여행을 GMT-1 과에서 로그를 다시합니다.마지막 로그인이 될 것입니다.

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

당신은 그것을 할 수 있습에서 클라이언트로 순간 시간대 보내는 값을 서버샘플 사용:

> moment.tz.guess()
"America/Asuncion"

간단한 방법으로 그것을 할 사용:

new Date().getTimezoneOffset();

점점 유효한 TZ 데이터베이스 시간대 이름 PHP 에서는 두 가지 단계 과정:

  1. 자바스크립트로 얻을 시간대 오프셋에서 분해 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.그것은 또한 포함되어 있습니다.

가능한 한 가지 옵션을 사용하는 것입 Date 헤더 필드에 정의 RFC7231 과를 포함한 타임존도 있습니다.의 과정,그것은 자주 묻는 질문에 대한 답변을 볼 값은 클라이언트의 시간대,하지만 그것이 될 수 있는 편리한 출발점입니다.

여기에 내가 그것을 하십시오.이 설정합니다 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
?>

이 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'];
?>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top