2010-05-24 27 views
20

Tôi cần xác định múi giờ của khách hàng (ví dụ: CET, GMT, EST) trong JS. Việc bù đắp là đơn giản, nhưng không có tất cả các thông tin cần thiết để xác định TZ, ít nhất là không dễ dàng. Tôi có cảm giác nó có thể có thể sử dụng kết hợp bù đắp, cho dù DST đang được sử dụng và có hiệu lực, v.v ... nhưng tôi hy vọng người khác đã thực hiện công việc, đặc biệt là xem xét các ngoại lệ lạ khi giao dịch với thời gian .Nhận múi giờ của khách hàng (không phải số tiền bù giờ GMT) trong JS

This question tương tự nhưng cả câu hỏi và câu trả lời đều dựa trên giả định (không chính xác) định dạng DateString của mỗi trình duyệt bao gồm tên múi giờ - không phải múi giờ. Đó là một chi tiết thực hiện.

Vì vậy, với điều đó tôi hiện đang bị kẹt.

Trả lời

7

Xem this question. Nó không phải là doable trong trường hợp chung, nhưng để chọn một múi giờ mặc định từ một danh sách ngắn các trường hợp có khả năng, bạn có thể thực hiện một dự đoán phong nha.

Cho phép người dùng ghi đè lên khi bạn đoán sai.

+0

Thật vậy, điều này chỉ cần thiết để cung cấp đoán đúng. Nếu nó có thể điền chính xác cho 90% người dùng tôi sẽ rất hạnh phúc. –

+0

Xin chào ... với điều này, chúng tôi sẽ nhận được múi giờ như nói Aisa/kabul sau đó làm thế nào để chuyển đổi nó thành 'AFT' (dạng viết tắt) ?? – Jeevi

+0

@TFool: thật không may, không có tra cứu công khai cho khu vực-> tên múi giờ mà tôi biết, do đó bạn sẽ phải tự tạo. (Thực ra thậm chí không có một tập hợp các từ viết tắt múi giờ được chấp nhận trên toàn cầu.) Hãy nhớ rằng không có ánh xạ một-một: ví dụ nếu bạn có vùng, bạn sẽ phải quyết định có sử dụng 'GMT' hay không hoặc múi giờ 'BST' tùy thuộc vào phần nào của năm mà bạn muốn thể hiện. – bobince

1

Điều tôi sẽ làm là xác định độ lệch chuẩn và ánh sáng ban ngày (có vẻ như bạn đã biết. Nếu không, bạn có thể bắt đầu với tham chiếu này http://onlineaspect.com/examples/timezone/detect_timezone.js bởi Josh Fraser). Việc xác định múi giờ luôn có thể được thực hiện ở phía máy chủ sau khi xác định được khoảng bù tiêu chuẩn và ánh sáng ban ngày. Sau đó, một cuộc gọi Ajax có thể được sử dụng để không cần làm mới trang. Kết quả cuối cùng là bây giờ bạn có múi giờ ở phía JavaScript.

+0

liên kết cung cấp cho biết không tìm thấy. – Ikrom

+0

Đây là liên kết được sửa chữa, tôi đoán: http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ – Dichev

-4

Nếu bạn chỉ muốn bù đắp, thì điều này đơn giản hơn nhiều

var curdate = new Date();

var offset = curdate.getTimezoneOffset();

+1

OP tìm kiếm tên múi giờ được viết tắt. – Gary

+0

OP _specifically said_ đây không phải là điều mong muốn. Xem tiêu đề: "__not GMT offset amount__" – Nateowami

32

Bạn có thể xóa nó khỏi phương thức toString() của đối tượng ngày. new Date.toString() kết quả bằng một cái gì đó như Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time) trong Firefox, Safari và Chrome. Dữ liệu bạn muốn có ở đó - các chữ cái viết hoa trong dấu ngoặc đơn. Tất cả những gì cần thiết là để cạo chúng.

Trong trường hợp của Internet Explorer, kết quả của toString() đã bao gồm EDT.

Trong trường hợp của Opera, lựa chọn duy nhất của bạn là giải quyết cho GMT-0400 hoặc tương tự. Không có gì có thể cạo trong phương thức toString().

var now = new Date().toString(); 
var TZ = now.indexOf('(') > -1 ? 
now.match(/\([^\)]+\)/)[0].match(/[A-Z]/g).join('') : 
now.match(/[A-Z]{3,4}/)[0]; 
if (TZ == "GMT" && /(GMT\W*\d{4})/.test(now)) TZ = RegExp.$1; 

Ví dụ kết quả:

  • Firefox: TZ = "EDT"

  • Safari: TZ = "EDT"

  • Chrome: TZ = "EDT"

  • IE: TZ = "EDT"

  • Opera: TZ = "GMT-0400"

vẻ để làm việc cũng như với tất cả các múi giờ châu Á và châu Âu ngẫu nhiên tôi đã cố gắng là tốt, trở về WPST cho Guam (Giờ chuẩn Tây Thái Bình Dương), MPST cho Kuala Lumpur (Giờ chuẩn bán đảo Malay), v.v. và suy giảm một cách hòa bình thành ký hiệu GMT + 0X00, trong đó trình duyệt không cung cấp tên (ví dụ như Perth).

+0

Fantastic. Chính xác những gì ALOT của những người đang tìm kiếm tôi tưởng tượng – Yablargo

+1

Cảm ơn vì điều này - chúng tôi đang sử dụng nó. Nhưng nó không hoạt động ở mọi nơi trên thế giới. Nó ném một lỗi ở Ả Rập Saudi, ví dụ. * Không thể gọi phương thức 'join' của null *. Bây giờ tôi đang gói nó trong một thử/nắm bắt, và thiết lập TZ để 'thời gian địa phương của tôi' như là một sửa chữa nhanh chóng. Tôi chắc chắn có một sửa chữa tốt hơn để được thực hiện, nhưng điều này là nhanh chóng :) – tom

+0

p.s. Tôi đoán vấn đề là Date.toString() không trả lại giá trị bằng cách sử dụng Bảng chữ cái La Mã, vì vậy regex không khớp với – tom

0

Bắt đầu từ this answer đến một câu hỏi khác, tôi thấy rằng IP API cũng cung cấp cho bạn các múi giờ - khá tiện dụng:

$.ajax({ 
    url: "http://ip-api.com/json", 
    type: 'GET', 
    success: function(json) { 
     console.log("Timezone: " + json.timezone); 
    }, 
    error: function(err) { 
     console.log("Request failed, error= " + err); 
    } 
}); 
Các vấn đề liên quan