Làm cách nào để lấy tên múi giờ trong JavaScript?


116

Tôi biết cách lấy lệch múi giờ, nhưng điều tôi cần là khả năng phát hiện những thứ như "Mỹ / New York". Điều đó thậm chí có thể thực hiện được từ JavaScript hay đó là thứ mà tôi sẽ phải xác định dựa trên sự bù đắp?


2
Đây là một chức năng mà Jon Nylander đã viết, có thể nó sẽ giúp bitbucket.org/pellepim/jstimezonedetect
yunzen vào

Đây là câu trả lời liên quan có thể hữu ích: stackoverflow.com/a/19421672/1447034
Douglas

Câu trả lời:


239

Các Quốc tế hóa API hỗ trợ nhận được múi giờ sử dụng, và được hỗ trợ trong tất cả các trình duyệt hiện nay.

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

Hãy nhớ rằng trên một số phiên bản trình duyệt cũ hơn hỗ trợ API quốc tế hóa, thuộc timeZonetính được đặt thành undefinedthay vì chuỗi múi giờ của người dùng. Tốt nhất tôi có thể nói, tại thời điểm viết bài (tháng 7 năm 2017), tất cả các trình duyệt hiện tại ngoại trừ IE11 sẽ trả về múi giờ của người dùng dưới dạng một chuỗi.


6
Chưa bao giờ nghĩ nó rất đơn giản này
Mohammed Shareef C

5
tuyệt vời, cái đầu tiên tôi đã thấy mà không sử dụng khoảnh khắc! Cảm ơn
r0bb077

3
Giải pháp tuyệt vời. Không muốn bao gồm toàn bộ plugin múi giờ thời điểm cho việc này.
Joan Gil

1
giải pháp rất đơn giản và tốt đẹp!
blackiii

2
@DanielCompton ôi tôi không biết về bảng này, cảm ơn bạn đã sửa lại.
CommonSenseCode

9

Tuy nhiên, hầu hết câu trả lời được ủng hộ có lẽ là cách tốt nhất để lấy múi giờ, Intl.DateTimeFormat().resolvedOptions().timeZonetrả về tên múi giờ IANA theo định nghĩa, bằng tiếng Anh.

Nếu bạn muốn tên của múi giờ bằng ngôn ngữ của người dùng hiện tại, bạn có thể phân tích cú pháp nó từ Datebiểu diễn chuỗi của như sau:

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Đã thử nghiệm trên Chrome và Firefox.

Tất nhiên, điều này sẽ không hoạt động như dự định trong một số môi trường. Ví dụ: node.js trả về độ lệch GMT (ví dụ GMT+07:00) thay vì tên. Nhưng tôi nghĩ nó vẫn có thể đọc được dưới dạng dự phòng.

PS sẽ không hoạt động trong IE11, chỉ là Intl...giải pháp.


6

Bạn có thể sử dụng tập lệnh này. http://pellepim.bitbucket.org/jstz/

Kho lưu trữ Fork hoặc clone ở đây. https://bitbucket.org/pellepim/jstimezonedetect

Khi bạn bao gồm tập lệnh, bạn có thể nhận được danh sách các múi giờ trong - jstz.olson.timezonesbiến.

Và mã sau được sử dụng để xác định múi giờ của trình duyệt khách hàng.

var tz = jstz.determine();
tz.name();

Thưởng thức jstz!


3

Truy xuất múi giờ theo tên (tức là "Mỹ / New York")

moment.tz.guess();

9
Xin lưu ý rằng nó cũng có thể đơn giản mà không có bất kỳ sự phụ thuộc nào:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

1
Đúng, mặc dù moment-js cũng đoán TZ cho các "trình duyệt" không hỗ trợ tính năng đó. :)
Ferran Maylinch

trong IE11 Intl.DateTimeFormat().resolvedOptions().timeZonetrả lại undefined, nhưng moment.tz.guess()trả về giá trị chính xác
Antoni4 Ngày


0

Điều này lấy mã múi giờ (ví dụ GMT:) trong javascript cũ hơn (tôi đang sử dụng tập lệnh ứng dụng google với công cụ cũ):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Tôi chỉ đặt điều này ở đây trong trường hợp ai đó cần nó.


1
Tôi nghĩ rằng điều đó chỉ hoạt động cho UTC/ GMT. Có vẻ như những người khác được đánh vần; vd Pacific Daylight Time.
Ian Dunn

-1

Hãy thử tham khảo mã này từ đây

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>

-5

Trong javascript, phương thức Date.getTimezoneOffset () trả về độ lệch múi giờ từ UTC, tính bằng phút, cho ngôn ngữ hiện tại.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'timezone sẽ là một công cụ hữu ích. http://momentjs.com/timezone/

Chuyển đổi ngày giữa các múi giờ

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

4
Bạn không hiểu hàng đợi.
srsajid

3
Các mẫu mã của bạn không liên quan đến câu hỏi ban đầu. Bạn sẽ sử dụng thư viện này như thế nào để trả về tên múi giờ hiện tại của người dùng?
Joe White,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.