html - 확인 - time datetime




사용자의 시간대 결정 (16)

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

아마도 HTTP 헤더 나 user-agent 문자열의 일부분일까요?


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에서 사용자 시간대를 감지하는 방법 . 또한 데모가 포함되어 있습니다.


가능한 옵션은 RFC 7231에 Date 정의되어 있으며 시간대를 포함해야하는 헤더 필드 를 사용하는 것 입니다. 물론이 값이 실제로 클라이언트의 시간대임을 보장 할 수는 없지만 편리한 출발점이 될 수 있습니다.


이 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'];
?>

JavaScript와 PHP는 간단합니다.

사용자가 자신의 내부 클록 및 / 또는 시간대를 엉망으로 만들 수 있다고해도 오프셋을 얻기 위해 지금까지 찾은 가장 좋은 방법은 new Date().getTimezoneOffset(); . 그것은 비 침습적이며, 머리가 아프고 제 3 자에게 의존 할 필요가 없습니다.

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

클라이언트 creates a new account 만들었다 고 가정하면 데이터는 post 으로 수신되고 date_created column 은 서버의 것이 아니라 클라이언트의 Unix 타임 스탬프로 insert/update 해야합니다.

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;

서버가 $_POST['tzo'] 와 같은 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=$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 값을 삽입하는 것이 좋습니다. 그것은 세션 또는 쿠키로.

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

나는 생각한다. 우리는 너무 많이 생각한다.


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

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

PHP 함수 date_default_timezone_set 사용하여 특정 시간대를 설정할 수 있습니다. 사용자에 대해 지정된 시간대를 설정합니다.

기본적으로 사용자의 시간대는 클라이언트 측에 있으므로 자바 스크립트를 사용해야합니다.

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

그러나 필자의 관점에서 볼 때 프로젝트에 등록이 필수적인지 사용자에게 묻는 것이 좋습니다.


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>

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

<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'];
?>

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


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

나는 똑똑한 사람이 되려고 노력하지 않고있어. 때로는 문제가 프로그래밍 컨텍스트 외부에서보다 미세한 솔루션을 갖고있는 경우도 있습니다.


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

It 's About Time

즉, 설명 된 접근 방식은 세션 쿠키에 저장되고 코드 숨김에 의해 GMT와 현지 시간 사이의 시간 값을 조정하는 데 사용되는 값을 반환하는 JavaScript getTimezoneOffset 함수에 의존합니다. 좋은 점은 사용자가 시간대를 지정하지 않아도된다는 것입니다 (코드가 자동으로 수행함). 더 많은 내용이 포함되어 있으므로 (이 기사에 링크 된 이유가 있습니다.) 코드를 제공하면 사용하기가 정말 쉽습니다. 나는 당신이 PHP와 다른 언어로 (당신이 ASP.NET을 이해하는 한) 논리를 변환 할 수 있다고 생각한다.


당신은 moment-timezone 클라이언트에서 그것을 할 수 있고 서버에 값을 보낼 수 있습니다; 샘플 사용법 :

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

마술은 모두 안에있는 것 같습니다.

visitortime.getTimezoneOffset()

멋지다. 나는 그것에 대해 몰랐다. Internet Explorer 등에서 작동합니까? 거기에서 Ajax에 JavaScript를 사용하고 쿠키를 설정할 수 있어야합니다. 나는 아마도 쿠키 경로를 직접 갈 것입니다.

사용자가 변경할 수 있어야합니다. 우리는 geolocation (maxmind를 통해)을 사용하여 얼마 전에 이것을 시도 했었습니다. 합리적이지 못한 경우가 많았습니다. 사용자가 자신의 프로필에 설정하도록 허용하고 사용자에게 알림을 표시합니다. 아직 설정하지 않았습니다.


쉽습니다. JavaScript getTimezoneOffset 함수를 다음과 같이 사용하십시오 :

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

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

  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을 통해)


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

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


자바 스크립트 :

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 타임 스탬프 형식으로 시간을이 함수에 제공하기 만하면됩니다. 자바 스크립트는 이미 사용자의 시간대를 알고 있습니다.

이렇게 :

PHP :

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

이것은 사용자가 컴퓨터 시계에 설정 한 시간대에 따라 시간을 정확하게 표시합니다. 아무에게도 무엇이든 물어 보거나 그것을 장소에 저장하지 않아도됩니다.


지금까지는 HTTP 표준에 포함시키는 것이 제안되었지만 클라이언트 표준 시간대를보고 할 HTTP 헤더가 없습니다.

그것이 나라면 클라이언트 측 JavaScript를 사용하여 시간대를 가져 와서 Ajax 등을 사용하여 서버에 제출하는 것이 좋습니다.


jQuery 하여 AJAX 요청의 HTTP 헤더로 시간대 오프셋을 전송하려면

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

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







timezone-offset