Làm cách nào tôi có thể thu thập thông tin múi giờ của khách truy cập? Tôi cần múi giờ, cũng như giờ bù giờ GMT.
Làm cách nào tôi có thể thu thập thông tin múi giờ của khách truy cập? Tôi cần múi giờ, cũng như giờ bù giờ GMT.
Câu trả lời:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Độ lệch múi giờ là chênh lệch, tính bằng phút, giữa UTC và giờ địa phương. Lưu ý rằng điều này có nghĩa là phần bù là dương nếu múi giờ địa phương đứng sau UTC và âm nếu nó ở phía trước. Ví dụ: nếu múi giờ của bạn là UTC + 10 (Giờ chuẩn miền đông Úc), -600 sẽ được trả về. Thời gian tiết kiệm ánh sáng ban ngày ngăn giá trị này không đổi ngay cả đối với một miền nhất định
Lưu ý rằng không phải tất cả các múi giờ đều được bù theo cả giờ: ví dụ: Newfoundland là UTC trừ 3h 30m (bỏ thời gian tiết kiệm ánh sáng ban ngày khỏi phương trình).
getTimezoneOffset
không chính xác có hiệu lực? Bài viết mà bạn đang đề cập là ngày tháng 6 năm 2007 và không có chi tiết về cách thức chức năng này không chính xác. Và trong thực tế, thư viện jsTimezoneDetect
bạn chỉ sử dụng getTimezoneOffset
chính nó.
var hrs = -(new Date().getTimezoneOffset() / 60)
để được bù đắp theo giờ thường được sử dụng
timezone
! =utc offset
Sử dụng một phần bù để tính toán múi giờ là một cách tiếp cận sai và bạn sẽ luôn gặp phải vấn đề. Múi giờ và quy tắc tiết kiệm ánh sáng ban ngày có thể thay đổi nhiều lần trong một năm và thật khó để theo kịp các thay đổi.
Để lấy múi giờ IANA của hệ thống bằng JavaScript, bạn nên sử dụng
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 nói rằng timeZone
có thể không xác định nếu không được cung cấp cho hàm tạo. Tuy nhiên, dự thảo trong tương lai (3.0) đã khắc phục vấn đề đó bằng cách thay đổi múi giờ mặc định của hệ thống.
Trong phiên bản API quốc tế hóa ECMAScript này, thuộc
timeZone
tính sẽ không được xác định nếu không có thuộctimeZone
tính nào được cung cấp trong đối tượng tùy chọn được cung cấp cho hàmIntl.DateTimeFormat
tạo . Tuy nhiên, các ứng dụng không nên dựa vào điều này, vì các phiên bản trong tương lai có thể trả về giá trị Chuỗi xác định múi giờ hiện tại của môi trường máy chủ.
trong ecma-402 / 3.0 vẫn còn trong bản nháp, nó đã đổi thành
Trong phiên bản API quốc tế hóa ECMAScript 2015 này, thuộc
timeZone
tính sẽ là tên của múi giờ mặc định nếu không có thuộctimeZone
tính nào được cung cấp trong đối tượng tùy chọn được cung cấp cho nhàIntl.DateTimeFormat
xây dựng. Phiên bản trước để lạitimeZone
tài sản không xác định trong trường hợp này.
Tôi nhận ra câu trả lời này hơi lạc đề nhưng tôi tưởng tượng nhiều người trong chúng ta đang tìm kiếm câu trả lời cũng muốn định dạng múi giờ để hiển thị và có lẽ cũng viết tắt tên khu vực. Vì vậy, ở đây nó đi ...
Nếu bạn muốn múi giờ của máy khách được định dạng độc đáo, bạn có thể dựa vào phương thức Date.toString của JavaScript và thực hiện:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Điều này sẽ cung cấp cho bạn "GMT-0400 (EST)" chẳng hạn, bao gồm cả phút múi giờ khi áp dụng.
Ngoài ra, với regex, bạn có thể trích xuất bất kỳ phần mong muốn nào:
Đối với "GMT-0400 (EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Đối với "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Chỉ với "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Chỉ với "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Tham chiếu Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
có chứa: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
vì vậy kết quả làDaylight Time)
new Date().toString()
hoàn toàn phụ thuộc vào cài đặt ngôn ngữ của bạn. Mong đợi kết quả đầu ra của khách hàng khác giống với đầu ra của bạn là một ý tưởng rất tồi.
Nó đã được trả lời làm thế nào để lấy phần bù trong vài phút dưới dạng số nguyên, nhưng trong trường hợp bất kỳ ai cũng muốn phần bù GMT cục bộ dưới dạng chuỗi, ví dụ "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
pad(parseInt(Math.abs(offset/60)), 2)
để làm cho đúng ... nếu không, bạn có thể sẽ nhận được +5.530 như trong trường hợp của tôi ... tôi không chắc liệu sàn toán học v.v ... sẽ tốt hơn ở đây hay không .... nhưng điều này ít nhất mang lại cho tôi 0530 như mong đợi
Bạn có thể dùng:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Phát hiện múi giờ của trình duyệt khá khó khăn để có được quyền, vì có rất ít thông tin được cung cấp bởi trình duyệt.
Khoảnh khắc Timezone sử dụng Date.getTimezoneOffset()
và Date.toString()
trong một số khoảnh khắc trong năm hiện tại để thu thập càng nhiều thông tin về môi trường trình duyệt càng tốt. Sau đó, nó so sánh thông tin đó với tất cả dữ liệu múi giờ được tải và trả về kết quả khớp gần nhất. Trong trường hợp quan hệ, múi giờ với thành phố có dân số lớn nhất được trả lại.
console.log(moment.tz.guess()); // America/Chicago
Tôi đã viết một chức năng trong dự án của tôi, mà trả về múi giờ trong hh:mm
định dạng. Tôi hy vọng điều này có thể giúp ai đó:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Một lớp lót cung cấp cả phần bù và múi giờ chỉ đơn giản là gọi toTimeString () trên một đối tượng Date mới. Từ MDN:
Các
toTimeString()
phương thức trả về phần thời gian của một đối tượng ngày ở dạng có thể đọc được của con người trong tiếng Anh-Mỹ.
Điều hấp dẫn là múi giờ không ở định dạng IANA tiêu chuẩn; nó thân thiện với người dùng hơn một chút so với định dạng IANA "lục địa / thành phố" . Dùng thử:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
Ở California ngay bây giờ, toTimeString()
trả về Pacific Daylight Time
trong khi API quốc tế trả về America/Los_Angeles
. Ở Colombia, bạn sẽ nhận được Colombia Standard Time
, so với America/Bogota
.
Lưu ý rằng nhiều câu trả lời khác cho câu hỏi này cố gắng có được thông tin tương tự bằng cách gọi Date.toString (). Cách tiếp cận đó không đáng tin cậy, như MDN giải thích :
Trường hợp ngày đề cập đến một thời điểm cụ thể. Gọi toString () sẽ trả về ngày được định dạng ở dạng người có thể đọc được bằng tiếng Anh Mỹ. [...] Đôi khi, mong muốn có được chuỗi chuỗi thời gian; một điều như vậy có thể được thực hiện với
toTimeString()
phương pháp.Các
toTimeString()
phương pháp đặc biệt hữu ích bởi vì công cụ phù hợp thực hiện ECMA-262 có thể khác nhau trong chuỗi thu được từtoString()
choDate
các đối tượng, như định dạng là thực hiện phụ thuộc; phương pháp cắt chuỗi đơn giản có thể không tạo ra kết quả nhất quán trên nhiều động cơ.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Với khoảnh khắc.js :
moment().format('zz');
Z
vàZZ
Với khoảnh khắc, bạn có thể tìm thấy múi giờ hiện tại như
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Với ban ngày, bạn có thể tìm thấy múi giờ hiện tại như
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Cả hai API trả về utc offset trong vài phút.
getTimezoneOffset()
.
Múi giờ trong hours-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Nếu bạn muốn chính xác như bạn đã đề cập trong bình luận, thì bạn nên thử như thế này-
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Nếu tất cả những gì bạn cần là chữ viết tắt múi giờ "MST" hoặc "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
không đáng tin cậy và MDN giải thích lý do. Tôi đã dán phần có liên quan từ tài liệu của họ trong câu trả lời của tôi .
Xem toán tử kết quả này ngược với Timezone. Vì vậy, áp dụng một số hàm toán học sau đó xác thực số num ít hơn hoặc nhiều hơn.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Nó nên như vậy floor
, phải không?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Ví dụ: Thu Jun 21 2018 18:12:50 GMT + 0530 (Giờ chuẩn Ấn Độ)
O / P: +0530
Date.toString()
không đáng tin cậy và MDN giải thích lý do. Tôi đã dán phần có liên quan từ tài liệu của họ trong câu trả lời của tôi .
Thử cái này,
new Date().toString().split("GMT")[1].split(" (")[0]
Giá trị này là từ máy của người dùng và nó có thể được thay đổi bất cứ lúc nào vì vậy tôi nghĩ rằng điều đó không quan trọng, tôi chỉ muốn nhận một giá trị gần đúng và sau đó chuyển đổi nó thành GMT trong máy chủ của mình.
Ví dụ: tôi đến từ Đài Loan và nó trả lại "+8" cho tôi.
Mã não
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Kết quả
+8
Trên new Date(
) bạn có thể lấy phần bù, để lấy tên múi giờ bạn có thể làm:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
bạn nhận được giá trị giữa ()
cuối ngày, đó là tên của múi giờ.
Date.toString()
không đáng tin cậy và MDN giải thích lý do. Tôi đã dán phần có liên quan từ tài liệu của họ trong câu trả lời của tôi . Ngoài ra, câu trả lời này đã được đưa ra ít nhất 3 lần rồi.
Đây sẽ là giải pháp của tôi:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Thay thế cho new Date().getTimezoneOffset()
vàmoment().format('zz')
, bạn cũng có thể sử dụngkhoảnh khắc:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone cũng khá lỗi và không rõ ràng ( https://bitbucket.org/pellepim/jstimezencedetect/issues?status=new&status=open )
Sử dụng công cụ này để chuyển đổi Offset sang postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Tôi đã tìm kiếm chỉ 3 chuỗi ký tự (như "PDT") và đã thử câu trả lời của Marquez nhưng phải điều chỉnh một chút để hỗ trợ trình duyệt chéo. May mắn thay, chuỗi là trận đấu tiềm năng cuối cùng :)
Đây là những gì tôi đã làm, trong CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Hoạt động trong IE8, IE9, Safari 9, Firefox 44 và Chrome 48
Date.toString()
không đáng tin cậy và MDN giải thích lý do. Tôi đã dán phần có liên quan từ tài liệu của họ trong câu trả lời của tôi .
Bạn chỉ cần bao gồm khoảnh khắc.js và jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
và sau đó
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
bạn chỉ có thể thử điều này. nó sẽ trả về cho bạn thời gian máy hiện tại
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
tôi sẽ hiển thị: "Thứ Sáu ngày 28 tháng 12 năm 2018 10:15:23 GMT + 0100 (Giờ chuẩn Trung Âu) {}"