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?
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?
Câu trả lời:
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 timeZone
tính được đặt thành undefined
thay 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.
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().timeZone
trả 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ừ Date
biể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.
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.timezones
biế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!
Truy xuất múi giờ theo tên (tức là "Mỹ / New York")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
trả lại undefined
, nhưng moment.tz.guess()
trả về giá trị chính xác
Bạn có thể chỉ cần viết mã của riêng mình bằng cách sử dụng bảng ánh xạ tại đây: http://www.timeanddate.com/time/zones/
hoặc sử dụng thư viện múi giờ thời điểm: http://momentjs.com/timezone/docs/
Xem zone.name; // America/Los_Angeles
hoặc, thư viện này: https://github.com/Canop/tzdetect.js
Đ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ó.
UTC
/ GMT
. Có vẻ như những người khác được đánh vần; vd Pacific Daylight Time
.
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>
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