2011-11-11 40 views

Trả lời

0

Bạn có thể lấy số timezone offset. Mà bạn có thể sử dụng để tính toán múi giờ gần đúng. Bạn có thể giữ danh sách liên kết bù trừ múi giờ và names. Phương pháp này không đưa ra bất kỳ giá trị chính xác nào.

+0

Bạn không thể tính múi giờ từ chênh lệch múi giờ. Bạn có thể tìm ra danh sách các múi giờ * có thể *, nhưng cũng có thể có nhiều múi giờ. Và bạn nói đó là "không cần thiết" nhưng điều đó hoàn toàn phụ thuộc vào những gì OP cần làm. Ví dụ: để tìm ra thời gian địa phương sẽ là 10 phút, chênh lệch múi giờ không đủ. –

+0

@JonSkeet Cảm ơn! Bạn hoàn toàn đúng, bạn chỉ có thể nhận được múi giờ gần đúng từ bù đắp. Chỉnh sửa câu trả lời. – abhinav

0
<? 
echo date("e"); 
?> 

Điều này sẽ cho kết quả:

Á/Kolkata

+0

Tôi cần múi giờ của trình duyệt, không phải máy chủ – user967144

3

Câu hỏi của bạn thực sự là về Javascript chứ không phải là PHP - bởi vì nó phụ thuộc vào khả năng của khách hàng.

Theo tôi được biết, Javascript cho phép bạn xác định múi giờ hiện tại bù đắp (chênh lệch giữa UTC và giờ địa phương) nhưng điều đó không không cho phép bạn một cách rõ ràng xác định múi giờ. Nhiều múi giờ sẽ chia sẻ cùng một mức bù tại bất kỳ thời điểm cụ thể nào, nhưng sẽ khác vào các thời điểm khác, nếu chúng quan sát tiết kiệm ánh sáng ban ngày và vào thời điểm chúng thay đổi vào và ra khỏi tiết kiệm ánh sáng ban ngày.

Nếu bạn chắc chắn cần múi giờ, bạn có thể muốn tìm ra một danh sách các múi giờ có thể, và trình bày rằng cho người dùng - cũng cho phép họ ghi đè lên các quyết định thu hẹp, lựa chọn bất kỳ múi thời gian.

Một lần nữa, nó thực sự phụ thuộc vào những gì bạn đang cố gắng đạt được.

+0

Tôi có thể lấy danh sách múi giờ đó để lưu trữ trong mảng php ở đâu? cho phép nói nếu bù đắp là "new Date(). getTimezoneOffset()/60" .. là giá trị đó có sẵn trong mảng của tôi? – user967144

+1

@ user967144: Trong mảng nào? Nó không thực sự rõ ràng những gì bạn đang yêu cầu. Để xác định các múi giờ có thể, bạn nên lặp qua các múi giờ * tất cả * và tìm các múi giờ có cùng độ lệch. Bạn có thể tìm tất cả các múi giờ bằng cách sử dụng ['DateTimeZone :: listIdentifiers'] (http://www.php.net/manual/en/datetimezone.listidentifiers.php). –

+0

tôi tìm thấy một liên kết ở đây bạn có thể xem xét chức năng được đăng bởi BrightNail không? codingforums.com/showthread.php?t=139888 – user967144

3

Bạn không cần jQuery để thực hiện việc này. Hãy thử đoạn mã sau:

var offset = (new Date()).getTimezoneOffset(); 
alert(offset); 

Nó sẽ cảnh báo múi giờ hiện tại bù đắp từ trình duyệt (trong vài phút).

Xem this jsfiddle as a proof.

Tôi nghĩ bạn sẽ cần tự chuyển đổi tên đó thành tên múi giờ. Nếu bạn muốn các tên nhất quán, bạn không nên phụ thuộc vào trình duyệt của người dùng.

Bạn có thể sử dụng mã này (xem this jsfiddle):

var offset = (new Date()).getTimezoneOffset(); 

var timezones = { 
    '-12': 'Pacific/Kwajalein', 
    '-11': 'Pacific/Samoa', 
    '-10': 'Pacific/Honolulu', 
    '-9': 'America/Juneau', 
    '-8': 'America/Los_Angeles', 
    '-7': 'America/Denver', 
    '-6': 'America/Mexico_City', 
    '-5': 'America/New_York', 
    '-4': 'America/Caracas', 
    '-3.5': 'America/St_Johns', 
    '-3': 'America/Argentina/Buenos_Aires', 
    '-2': 'Atlantic/Azores', 
    '-1': 'Atlantic/Azores', 
    '0': 'Europe/London', 
    '1': 'Europe/Paris', 
    '2': 'Europe/Helsinki', 
    '3': 'Europe/Moscow', 
    '3.5': 'Asia/Tehran', 
    '4': 'Asia/Baku', 
    '4.5': 'Asia/Kabul', 
    '5': 'Asia/Karachi', 
    '5.5': 'Asia/Calcutta', 
    '6': 'Asia/Colombo', 
    '7': 'Asia/Bangkok', 
    '8': 'Asia/Singapore', 
    '9': 'Asia/Tokyo', 
    '9.5': 'Australia/Darwin', 
    '10': 'Pacific/Guam', 
    '11': 'Asia/Magadan', 
    '12': 'Asia/Kamchatka' 
}; 

alert(timezones[-offset/60]); 

Tuy nhiên tôi sẽ không dựa vào điều này quá nhiều.

+0

đẹp, nó cảnh báo "-330" .. bây giờ làm thế nào tôi có thể sửa đổi nó để hiển thị 'Asia/Calcutta'? – user967144

+0

@ user967144: Xem phiên bản cập nhật, bây giờ cửa sổ bật lên này tên bạn mong đợi. – Tadeck

+0

cảm ơn nhưng nó không đáng tin cậy? – user967144

11

Đối với việc phát hiện múi giờ bù đắp bạn có thể sử dụng chức năng này:

function get_time_zone_offset() { 
    var current_date = new Date(); 
    return parseInt(-current_date.getTimezoneOffset()/60); 
} 

Ví dụ bạn có thể thấy here

13

Đây là bài viết đầu tiên của tôi ở đây nhưng hy vọng tôi có thể giúp ai đó. Tôi cảm thấy bị cuốn hút bởi vì trang web này đã giúp tôi rất nhiều. Cảm ơn thành viên stackoverflow!

http://www.pageloom.com/automatic-timezone-detection-with-javascript

Từ những gì tôi hiểu về mã JavaScript này nó là rất chính xác và sẽ có thể trả lại bù đắp từ UST thì Olson tên múi giờ Cơ sở dữ liệu tương ứng, và xử lý các vấn đề thời gian tiết kiệm ánh sáng ban ngày (ví dụ. - 5:00, America/New_york, đúng).

http://www.php.net/manual/en/timezones.america.php

Liên kết ở trên chỉ là một danh sách các thông số múi giờ php hỗ trợ, mà như xa như tôi có thể nói phù hợp với mã JavaScript này (Tôi chắc chắn rằng là có lợi tôi chỉ không biết tại sao nhưng Tôi vẫn viết mã của tôi và tôi kinda mới để php/mysql).

Trở ngại duy nhất bạn sẽ gặp phải sau khi nhận được mã này hoạt động trên trang html của bạn có khả năng sẽ nhận được các giá trị này cho php và sau đó đến mysql nếu đó là những gì bạn cần. Tôi đã đạt được điều này bằng cách gửi các giá trị này dưới dạng $ .post sử dụng JQuery. Tôi nghĩ rằng đây là cách dễ nhất để làm điều đó (xin vui lòng ai đó sửa tôi nếu tôi sai). Tôi tin rằng các lựa chọn thay thế khác đang sử dụng một lệnh AJAX (phức tạp hơn) hoặc cookie (tôi nghĩ?).

Sau khi tôi nhận được các giá trị từ mã Java-script tới máy chủ (PHP), tôi lưu trữ chúng dưới dạng biến phiên vì vậy chúng sẽ thay đổi nếu người dùng trên trang web của tôi đăng nhập từ múi giờ khác thông thường. Tuy nhiên, chúng cũng có thể dễ dàng được lưu vào cơ sở dữ liệu.

Nếu bạn sử dụng tuyến đường JQuery, điều này cần nằm trong tiêu đề của tài liệu html nơi $ .post đang được thực hiện.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 

Tập lệnh timezonedetect được cập nhật nhất có thể được tìm thấy được liên kết trên url đầu tiên mà tôi đã đăng.

//replace this comment with the most updated timezonedetect code from that first link 
var timezone = jstz.determine_timezone(); 
var tzoffset = timezone.offset(); 
var tzname = timezone.name(); 
var tzdst = timezone.dst(); 
$.post("scripts/tzdetect.php", { tzoffset: tzoffset, tzname: tzname, tzdst: tzdst }); 

Tệp nhận trong trường hợp này tzdetect.php sẽ giống như thế này nếu bạn muốn dữ liệu được lưu dưới dạng biến phiên.

<?php 
session_start(); 
$_SESSION['tzname'] = $_POST['tzname']; 
$_SESSION['tzoffset'] = $_POST['tzoffset']; 
$_SESSION['tzdst'] = $_POST['tzdst']; 
?> 
+1

Tóm tắt: sử dụng jstz (aka jsTimezoneDetect) http://pellepim.bitbucket.org/jstz/ –

Các vấn đề liên quan