Hướng dẫn php get user timezone name - php lấy tên múi giờ của người dùng

Sử dụng các trường hợp nhận được múi giờ của trình duyệt

Nhận thời gian của người dùng có thể giúp ứng dụng của bạn hiển thị ngày và thời gian so với trình duyệt của người dùng. Điều này có nghĩa là người dùng ở New York sẽ thấy thời gian so với thời gian của Mỹ/New_York, trong khi người dùng ở Ấn Độ sẽ thấy thời gian theo Timezone châu Á/Kolkata.America/New_York timezone, while a user in India will see time according to the Asia/Kolkata timezone.

Một trường hợp sử dụng khác có thể được sử dụng thời gian của người dùng để tạo ra một sự kiện thay mặt anh ta với các API lịch như của Google và Outlook. Người dùng có thể chọn thời gian từ mặt trận và trong phần phụ trợ, ứng dụng tạo ra một sự kiện tại thời điểm đó, sử dụng múi giờ của trình duyệt. Cần lưu ý rằng tất cả các API lịch cần một múi giờ để tạo ra một sự kiện.

Phát hiện tên múi giờ của người dùng

Phát hiện timezoone của người dùng là một quá trình hai bước:

  1. Nhận phần bù múi giờ của trình duyệt với JavaScript và gửi nó đến PHP (thông qua AJAX hoặc một cái gì đó).
  2. Chuyển đổi phần bù múi giờ thành tên múi giờ cơ sở dữ liệu TZ hợp lệ như America/New_York, Asia/Kolkata.America/New_York, Asia/Kolkata.

1) Nhận phần bù múi giờ của trình duyệt

JavaScript có phương thức GetTimezoneOffset mang lại sự khác biệt về thời gian, trong vài phút, từ giờ địa phương đến UTC. Chúng ta cần chuyển phần bù này cho máy chủ.getTimezoneOffset method which gives timezone difference, in minutes, from current local time to UTC. We need to pass this offset to the server.

Cần lưu ý rằng GetTimezoneOffset trả về một phần bù là dương tính nếu timezone cục bộ đứng sau UTC và tiêu cực nếu nó ở phía trước. Vì vậy, chúng ta phải thêm một dấu hiệu đối diện (+ hoặc -) vào phần bù.getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and negative if it is ahead. So we must add an opposite sign (+ or -) to the offset.

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

// Timezone difference in minutes such as 330 or -360 or 0
console.log(timezone_offset_minutes); 

2) Trong PHP, chuyển đổi thời gian bù thời gian trong vài phút sang tên múi giờ

Bạn có thể nhận tên timezone từ thời gian bù trong vài phút thông qua hàm timezone_name_from_abbr.timezone_name_from_abbr function.

// This is just an example. In application this will come from Javascript (via an AJAX or something)
$timezone_offset_minutes = 330;  // $_GET['timezone_offset_minutes']

// Convert minutes to seconds
$timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);

// Asia/Kolkata
echo $timezone_name;

Bây giờ khi bạn nhận được tên timezone, bạn có thể nhận được ngày và thời gian tương đối với múi giờ của người dùng:

date_default_timezone_set($timezone_name);

Thử nghiệm

Nhấp vào nút bên dưới để xem tên của múi giờ hiện tại của bạn:

Điều này sẽ giúp bạn có được múi giờ như một biến PHP. Tôi đã viết một chức năng bằng cách sử dụng jQuery và PHP. Điều này được kiểm tra, và không hoạt động!

Trên trang PHP nơi bạn muốn có múi giờ làm biến, hãy có đoạn mã này ở đâu đó gần đầu trang:


Điều này sẽ đọc biến phiên "Thời gian", mà chúng tôi sắp tạo ra.

Trên cùng một trang, trong phần , trước hết bạn cần bao gồm jQuery:


Cũng trong phần , dán jQuery này:


Bạn có thể hoặc không thể nhận thấy, nhưng bạn cần thay đổi URL thành miền thực tế của bạn.

Một điều cuối cùng. Bạn có thể đang tự hỏi cái múi giờ Heck.php là gì. Chà, nó chỉ đơn giản là thế này: (Tạo một tệp mới có tên là Timezone.php và trỏ đến nó với URL trên)timezone.php and point to it with the above url)


Nếu điều này hoạt động chính xác, trước tiên nó sẽ tải trang, thực hiện JavaScript và tải lại trang. Sau đó, bạn sẽ có thể đọc biến $ timezone và sử dụng nó cho niềm vui của bạn! Nó trả về phần bù múi giờ UTC/GMT hiện tại (GMT -7) hoặc bất kỳ múi giờ nào bạn đang ở.

Bạn có thể đọc thêm về điều này trên blog của tôi

Tôi muốn lấy tên múi giờ của người dùng hiện tại để nó có thể được sử dụng với PHP DATE_DEFAULT_TIMEZONE_SET (). Sau khi tìm kiếm một vài điều cuối cùng tôi đã tìm ra giải pháp cho việc này. Tôi không tuyệt vời với mã mặc dù vậy nên mọi kiểm tra/trợ giúp mã sẽ được đánh giá cao.

Miễn là nó là một dự đoán công bằng về múi giờ của người dùng, nó đủ tốt cho tôi. Nó có vẻ hoạt động tốt. Đây là:

/**
 * JS/jQuery - Set cookie of current user's UTC offset (format example: -06:00)
 *
 */
$(document).ready( function() {

        // Get UTC offset
        var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
        var offset = (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);

        if (document.cookie.indexOf("hp_time_offset") >= 0) {} else {

            // Set cookie
            $.cookie( 'hp_time_offset', offset, { expires : null, path:'/' } );     
        }   

});


/**
 * PHP - Get the UTC offset cookie and convert it to a timezone name
 *
 */
function hp_get_timezone() {

    if( isset( $_COOKIE['hp_time_offset'] ) ) {

        $time_offset = $_COOKIE['hp_time_offset'];

        // validate - exit if offset cookie contains anything other than "0-9 + - :",
        if ( preg_match('/[^0-9:\+\-]/', $time_offset) )
            return;

        // validate - exit if offset cookie is not in correct range
        if ( ! in_array($time_offset, range(-12, 14)))
            return;

        // Calculate seconds from offset
        list($hours, $minutes) = explode(':', $time_offset);
        $seconds = $hours * 60 * 60 + $minutes * 60;

        // Get timezone name from seconds
        $tz = timezone_name_from_abbr('', $seconds, 1);

        // bug fix
        if($tz === false) 
            $tz = timezone_name_from_abbr('', $seconds, 0);

        // if still false, set a default timezone name.
        if($tz === false) 
            $tz = 'America/New_York';

    } else {

        // If cookie doesn't exist, set a default timezone name.
        $tz = 'America/New_York';       
    }

    return $tz;
}


//set timezone 
date_default_timezone_set( hp_get_timezone() );

Bất kỳ trợ giúp đánh giá cao.

Làm cách nào để nhận được múi giờ người dùng hiện tại?

Để có được múi giờ của trình duyệt hiện tại, bạn có thể sử dụng phương thức GetTimeZoneOffset () từ đối tượng Ngày JavaScript.GetTimeZoneOffset () trả về chênh lệch thời gian, tính theo phút, giữa thời gian UTC và thời gian địa phương.use the getTimezoneOffset() method from the JavaScript Date object. The getTimezoneOffset() returns the time difference, in minutes, between UTC time and local time.

Làm cách nào để tìm múi giờ mặc định trong PHP?

Hàm date_default_timezone_get () trả về thời gian mặc định được sử dụng bởi tất cả các hàm ngày/thời gian trong tập lệnh.date_default_timezone_get() function returns the default timezone used by all date/time functions in the script.

Làm thế nào để tôi có được thời gian của Trình duyệt máy khách ở cuối PHP?

Phát hiện tên múi giờ của người dùng Phát hiện timezoone của người dùng là một quá trình hai bước: nhận phần bù múi giờ của trình duyệt với JavaScript và gửi nó đến PHP (thông qua AJAX hoặc một cái gì đó).Chuyển đổi phần bù múi giờ thành tên múi giờ cơ sở dữ liệu TZ hợp lệ như America/New_York, Asia/Kolkata.Get the timezone offset of the browser with Javascript, and sent it to PHP (via AJAX or something). Convert the timezone offset to a valid TZ Database timezone name such as America/New_York, Asia/Kolkata.

Timezone PHP là gì?

Hàm date_default_timezone_set () đặt thời gian mặc định được sử dụng bởi tất cả các hàm ngày/thời gian trong tập lệnh..