Chuyển đổi ngày thành múi giờ khác trong JavaScript


336

Tôi đang tìm kiếm một chức năng để chuyển đổi ngày trong múi giờ này sang múi giờ khác.

Nó cần hai tham số,

  • ngày (ở định dạng "2012/04/10 10:10:30 +0000")
  • chuỗi múi giờ ("Châu Á / Jakarta")

Chuỗi múi giờ được mô tả trong http://en.wikipedia.org/wiki/Zone.tab

Có cách nào làm dễ hơn không?


1
Tìm phần bù UTC của một thành phố nhất định. stackoverflow.com/questions/3002910/ trộm
Brandon Boone

3
Tôi muốn tính toán không chỉ bù UTC mà còn tiết kiệm ánh sáng ban ngày / thời gian mùa hè. Vì vậy, thời gian sẽ trở lại chính xác.
Rizky Ramadhan


Kiểm tra cái này cũng như stackoverflow.com/questions/16084313/
Kẻ

Tắt cài đặt múi giờ của bạn bằng lệnh ngày unix: ngày +% s -d 'ngày 1 tháng 1 năm 1970'
anthony

Câu trả lời:


189

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString


1
Tôi đã thay đổi câu trả lời cho điều này, vì đây là phương pháp đúng và chuẩn mà không sử dụng bất kỳ thư viện nào.
Rizky Ramadhan

5
Tài liệu MDN nói rõ rằng múi giờ duy nhất được yêu cầu phải được công nhận trong tất cả các triển khai là UTC. ( stackoverflow.com/questions/10087819/ )) Nhấp vào nút [Chạy đoạn mã] trong IE11 sẽ xảy ra lỗi.
Sông Vivian

1
Nếu bất cứ ai đang tìm kiếm triển khai hoạt động cho tất cả trình duyệt ngay bây giờ, họ có thể thử bất kỳ câu trả lời nào dưới đây với nhược điểm riêng của nó ...
Rizky Ramadhan

14
Câu trả lời này hiển thị chính xác việc chuyển một múi giờ đến toLocaleString, nhưng sau đó nó hiển thị rất không chính xác việc chuyển chuỗi đó trở lại vào hàm Datetạo. Đó là yêu cầu rắc rối. Trình phân tích chuỗi ngày không bắt buộc phải chấp nhận các định dạng cụ thể của miền địa phương và đầu vào sẽ được xử lý như thể nó nằm trong múi giờ địa phương. Đừng làm vậy. Chỉ cần sử dụng đầu ra chuỗi từ toLocalStringcuộc gọi đầu tiên .
Matt Johnson-Pint

4
@MattJohnson sau đó bạn không thể sử dụng getHour () hoặc các phương thức như vậy
Ali Padida

131

Đối với người dùng Moment.js , giờ đây bạn có thể sử dụng múi giờ . Sử dụng nó, chức năng của bạn sẽ trông giống như thế này:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}

3
Tôi không chắc chắn làm thế nào để thêm múi giờ mới, các tài liệu đã không giúp tôi. Tôi chỉ là một lập trình viên, không phải là một chuyên gia thời gian!
Parziphal

8
Vấn đề ở đây là điều này không trả về một đối tượng Date mới, nó trả về một chuỗi. Nếu đó là những gì bạn muốn đó là tốt, tất nhiên.
nickdnk

2
Không phải là "khoảnh khắc trở lại (thời gian) .tz (vùng) .format (định dạng);" ? Mã bạn đã cung cấp trong mã của bạn có lỗi "Ngày không hợp lệ".
Tarek

1
Không thể tải Moment.js trong trình duyệt. Rất buồn :(
Daniil Shevelev

4
Nếu bạn không hài lòng về việc gửi 180K tới trình duyệt với một bản sao của cơ sở dữ liệu tz và có thể sống với sự xuống cấp theo múi giờ hiện tại trên các trình duyệt cũ hơn, hãy thử sử dụng câu trả lời của @ lambinator Date.prototype.toLocaleString.
Peter V. Mørch

92

Bị đánh cắp không biết xấu hổ từ: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

/** 
 * function to calculate local time
 * in a different city
 * given the city's UTC offset
 */
function calcTime(city, offset) {

    // create Date object for current location
    var d = new Date();

    // convert to msec
    // add local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time in " + city + " is " + nd.toLocaleString();
}

hàm này rất hữu ích để tính giá trị múi giờ bằng cách cung cấp tên của thành phố / quốc gia và giá trị bù


4
tốt .... nhưng tôi nghĩ rằng anh ấy muốn bù đắp cho anh ấy dựa trên thông qua trong thành phố.
Brandon Boone

117
Điều này không tính đến thay đổi tiết kiệm ánh sáng ban ngày.
Robotbugs

12
không trả lời câu hỏi mà chỉ trả lời câu hỏi của tôi (+1)
Rjust85

Đó là '3600000' theo nghĩa đen đã giết tôi! Trong đầu vào, tz nên được đưa ra trong vài giờ! Và, nó nên được trừ. Vì vậy, nếu bạn vượt qua: var d = new Date calcTime ('', d.getTimezone Offerset () / 60); Nó sẽ trả lại cùng một lúc.
Praveen

1
Câu trả lời này đã hết hạn và cần được loại bỏ, đặc biệt là phần sử dụng toLocaleString , có khả năng sẽ báo cáo múi giờ của máy chủ khi nó đã được chuyển sang múi giờ khác. Có nhiều cách tốt hơn để tạo dấu thời gian theo cách thủ công cho các độ lệch khác nhau.
RobG

89

Hầu hết các trình duyệt trên máy tính để bàn (không phải thiết bị di động) ngoại trừ Safari đều hỗ trợ chức năng toLocaleString với các đối số, các trình duyệt cũ hơn thường bỏ qua các đối số.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })

4
Thất bại trong Firefox và Edge :(
Šime Vidas

10
Vì điều này không thành công trong FF và IE11 +, nên cần tìm một giải pháp khác.
jdavid.net 17/9/2015

2
Edge và chrome thích nó :)
Suhail Mumtaz Awan

6
Nó chỉ hoạt động trên Chrome v59 và Firefox desktop v54 và Chome trên Android v59 và Safari 10 trên iOS 10.3. Nó không hoạt động trên IE10. Mô tả của MDN về Date.prototype.toLocaleString () có một toLocaleStringSupportsLocales()triển khai cho phép bạn kiểm tra hỗ trợ một cách đáng tin cậy.
Peter V. Mørch

1
Đã thử nghiệm thành công trong node.js v8.7.0
Heinrich Ulbricht

56

Được rồi, tìm thấy nó!

Tôi đang sử dụng múi giờ-js . đây là mã

var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");

console.debug(dt); //return formatted date-time in asia/jakarta

90
Tôi phải bỏ phiếu chống lại điều này, múi giờ-js không hỗ trợ DST và nó không quảng cáo rằng trong phần đọc của nó, điều này làm cho nó trở thành một mẹo tồi cho những người tìm kiếm điều này. Xem: github.com/mde/timezone-js/issues/51 và một số vấn đề khác đã được nộp và dường như không được khắc phục.

@nus yeah, nhưng thực sự không có giải pháp nào cho quản lý thời gian / ngày của khách hàng ... jquery ui datepicker đã khiến tôi phát điên vì điều này. chúc mừng
Lucas

2
@Marabunta, trông giống như múi giờ (câu trả lời của Brian Di Palma) hỗ trợ DST github.com/moment/moment-timezone/issues/21
welldan97

2
Đừng sử dụng TimezoneJS, nó đã bị lỗi xung quanh các thay đổi DST.
matf

17

Nếu bạn không muốn nhập một số thư viện lớn, bạn có thể sử dụng Intl.DateTimeFormat để chuyển đổi các đối tượng Date thành các múi giờ khác nhau.

// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  timeZone: 'Asia/Jakarta',
  timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

Offsets, tiết kiệm ánh sáng ban ngày và thay đổi trong quá khứ sẽ được chăm sóc cho bạn.


IE10 + không hỗ trợ API quốc tế cho các múi giờ. khoảnh khắc.github.io/luxon/docs/manual/matrix.html
Chloe

Đây thực sự là câu trả lời tốt nhất. toLocaleStringđã triển khai không nhất quán và điều này hoạt động từ IE11 trở đi.
dlsso

FYI: Điều này thực sự không hoạt động trong IE11, ít nhất là trên Windows 8.1. Khi bạn cố gắng tạo formatterđối tượng, bạn nhận được: `` `Giá trị tùy chọn 'Châu Á / Jakarta' cho 'timeZone' nằm ngoài phạm vi hợp lệ. Dự kiến: ['UTC'] `` `
veddermatic

Có cách nào để chuyển đổi kết quả cuối cùng từ bộ định dạng thành đối tượng Date không?
mding5692

10

Hiểu rồi !

Muốn buộc ngày hiển thị = ngày máy chủ, không làm mờ cài đặt cục bộ (UTC).

Máy chủ của tôi là GMT-6 -> Ngày mới (). GetTimezone Offerset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);

2
Mặc dù nó hiển thị thời gian ngây thơ chính xác, thông tin múi giờ từ myOldDateObj vẫn được giữ. Vì vậy, thực sự đó là thời gian sai (khi bạn dành thời gian làm ví dụ về thời gian chứ không phải thời gian trên đồng hồ).
gabn88

@ gabn88: Bạn sẽ không thể thay đổi thời gian máy chủ bằng Javascript ... Để khắc phục thời gian máy chủ, hãy thực hiện ở cấp hệ điều hành.
Cedric Simon

2
Tôi không cần phải sửa thời gian máy chủ;) Thời gian máy chủ luôn là UTC đối với tôi. Nhưng tôi có tổ chức khác nhau trong các múi giờ khác nhau. Và các thiết bị của họ phải luôn hiển thị thời gian nơi tổ chức của họ đóng quân, mọi lúc mọi nơi.
gabn88

Chúng tôi có vấn đề tương tự như hiển thị ngày luôn luôn múi giờ X. Chúng tôi cố gắng gửi tất cả các ngày ở định dạng chuỗi từ máy chủ và trong trình duyệt, chúng tôi chỉ coi chúng là ngày múi giờ địa phương.
Venkateswara Rao

5

Bạn có thể sử dụng phương thức toLocaleString () để đặt múi giờ.

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })

Đối với Ấn Độ, bạn có thể sử dụng "Ấn Độ / Giáng sinh" và sau đây là các múi giờ khác nhau,

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"

Bạn không thiết lập múi giờ, mà là tạo ra một chuỗi với thời gian được biểu thị trong múi giờ đó. Ngày giữ nguyên.
Gerard ONeill

Các toLocaleStringgiải pháp đã được đưa ra 4 năm trước .
Dan Dascalescu

4

Nếu bạn chỉ cần chuyển đổi các múi giờ, tôi đã tải lên một phiên bản rút gọn của múi giờ thời gian chỉ với chức năng tối thiểu trần. Dữ liệu ~ 1KB + của nó:

S.loadData({
    "zones": [
        "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
        "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
    ],
    "links": [
        "Europe/Paris|Europe/Madrid",
    ]
});

let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());

2

Đặt một biến với năm, tháng và ngày được phân tách bằng các ký hiệu '-', cộng với mẫu 'T' và thời gian theo mẫu HH: mm: ss, theo sau là +01: 00 ở cuối chuỗi (trong trường hợp của tôi là múi giờ là +1). Sau đó sử dụng chuỗi này làm đối số cho hàm tạo ngày.

//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";

var date = new Date(dateAndTime );

2

Tôi nên lưu ý rằng tôi bị hạn chế đối với các thư viện bên ngoài mà tôi có thể sử dụng. Moment.js và timezone-js KHÔNG phải là một lựa chọn cho tôi.

Đối tượng ngày js mà tôi có trong UTC. Tôi cần lấy ngày VÀ thời gian kể từ ngày này theo múi giờ cụ thể ('America / Chicago' trong trường hợp của tôi).

 var currentUtcTime = new Date(); // This is in UTC

 // Converts the UTC time to a locale specific format, including adjusting for timezone.
 var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));

 console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
 console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
 console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
 console.log('currentDateTimeCentralTimeZone: ' +        currentDateTimeCentralTimeZone.toLocaleDateString());
 console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
 console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());

UTC hiện đang đi trước 6 giờ so với 'America / Chicago'. Đầu ra là:

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15

11
new Date();trả lại múi giờ địa phương, không phải UTC
Mirko

1
từ các tài liệu:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko

Hừm. Kinda khó hiểu. Điều này không thay đổi múi giờ vào một ngày; thay vì nó tạo ra một ngày mới với giờ thay đổi. Sẽ rõ ràng hơn nhiều khi sử dụng biểu thức chính quy để trích xuất các giá trị bạn muốn từ chuỗi được tạo từ lệnh gọi toLocaleString.
Gerard ONeill

2

Đây là mã của tôi, nó đang hoạt động hoàn hảo, bạn có thể thử với bản demo bên dưới:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>


Chào mừng bạn đến với StackOverflow! Bạn có thể cung cấp thêm thông tin như cách mã này hoạt động và nó làm gì không? Làm thế nào nó khắc phục vấn đề?
DarkSuniuM

Mã đã cho ở trên của tôi là cập nhật múi giờ của bạn sang múi giờ của các quốc gia khác.
Sahil Kapoor

Bạn cần đặt HTML vào tệp html của mình và được cung cấp mã jquery ở trên. Nó sẽ hoạt động cho bạn theo ('en-US', {timeZone: 'America / Chicago'}) bạn cần cập nhật hai giá trị này, nếu bạn muốn múi giờ của các quốc gia khác Cảm ơn
Sahil Kapoor

Không chờ đợi. Tôi chỉ nêu lên điều này mà không xem xét cẩn thận. Tại sao bạn thêm 1 vào currentDateTimeCentralTimeZone.getHours()? Nếu không có nó sẽ làm việc và cũng giống như câu trả lời của seeking27 stackoverflow.com/a/40809160/1404185
chetstone

1

Bạn cũng có thể thử điều này để chuyển đổi múi giờ ngày sang Ấn Độ:

var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);

1
Sau bước thứ 2, tôi có thời gian ở Ấn Độ ... vậy tại sao bạn vẫn thêm 5 & 1/2 giờ cho nó?
dùng3833732

Khi sử dụng phương pháp đó, tôi nhận được những điều sau đây ở Na Uy khi tôi đăng nhập bảng điều khiển với Chrome: Bản gốc: Thu Sep 27 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Đã sửa đổi: Ngày 27 tháng 9 năm 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). Mùi sentraleuropeisk sommertid có nghĩa là Giờ mùa hè Trung Âu. Không chắc chắn nếu điều đó sẽ làm việc khi bạn cần thời gian mùa hè cho Ấn Độ, hoặc ngược lại khi bạn ở Ấn Độ và cần thời gian mùa hè cho châu Âu, v.v.
Kebman

Sử dụng setHours () như thế này không tính đến các chuyển đổi ngày, tháng, năm, ví dụ 3:30 sáng ở New Dell vào ngày 8 là 11 giờ tối ngày 7 tại Luân Đôn. Sau đó xem xét kết thúc tháng, năm và ngày nhuận. Có ngày làm toán đó <pre> let local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); hãy để date_str = local_time.toISOString (). lát (0, 10); hãy để time_str = local_time.toISOString (). lát (11, -1); hãy để timezone_str = std_timezone.timezone_str; </ pre>
Lincoln Randall McFarland

1

Đã xem xung quanh rất nhiều bao gồm các liên kết từ trang này, tôi tìm thấy bài viết tuyệt vời này, sử dụng múi giờ thời gian:

https://www.webniraj.com/2016/11/23/javascript-USE-moment-js-to-display-dates-times-in-users-timezone/

Để tóm tắt nó:

Nhận múi giờ của người dùng

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

Trả về, ví dụ: Múi giờ: Châu Âu / Luân Đôn

Đặt múi giờ người dùng mặc định

moment.tz.setDefault(tz);

Đặt múi giờ tùy chỉnh

moment.tz.setDefault('America/Los_Angeles');

Chuyển đổi ngày / giờ thành múi giờ địa phương, giả sử ngày / giờ ban đầu là trong UTC

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

Trả về: CN, ngày 25 tháng 12 năm 2016, 7:00 sáng

Chuyển đổi ngày / giờ thành LA Time

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

Trả về: Thứ bảy, ngày 24 tháng 12 năm 2016, 11:00 tối

Chuyển đổi từ LA giờ sang Luân Đôn

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

Trả về: CN, ngày 25 tháng 12 năm 2016, 3:00 chiều


1

Bạn cũng có thể sử dụng https://www.npmjs.com/package/ctoc_timezone

Nó đã có nhiều thực hiện đơn giản và tùy chỉnh định dạng.

Thay đổi định dạng trong toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

Đầu ra:

28th Feb 2013 19:00:00 EST

Bạn có thể khám phá nhiều chức năng trong tài liệu.


0

có một mô-đun npm được gọi là 'timezones.json' bạn có thể sử dụng cho việc này; về cơ bản nó bao gồm một tệp json với các đối tượng chứa thông tin về tiết kiệm ánh sáng ban ngày và bù đắp, ....

đối với Châu Á / jakarta, nó có thể trả về đối tượng này:

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

bạn có thể tìm thấy nó ở đây:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

hy vọng nó hữu ích


0

Những người quen thuộc với java.timegói java 8 , hoặc joda-timecó thể sẽ yêu thích đứa trẻ mới trên khối: thư viện js-joda .

Tải về

npm install js-joda js-joda-timezone --save

Thí dụ

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

Trong bản chất java thực sự, nó khá dài dòng lol. Nhưng, là một thư viện java được chuyển, đặc biệt là xem xét họ đã chuyển các trường hợp thử nghiệm 1800'ish, nó cũng có thể hoạt động chính xác tuyệt vời.

Thao tác Chrono là khó. Đó là lý do tại sao nhiều thư viện khác bị lỗi trong các trường hợp cạnh. Moment.js dường như có được múi giờ đúng, nhưng các js khác tôi đã thấy, bao gồm timezone-js, có vẻ không đáng tin.


0

Gần đây tôi đã làm điều này trong Bản in:

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

Tôi sử dụng định dạng "en-UK" vì nó đơn giản. Có thể là "en-US" hoặc bất cứ điều gì hoạt động.

Nếu đối số đầu tiên là múi giờ địa phương của bạn và seconde là múi giờ mục tiêu của bạn, nó sẽ trả về một đối tượng Date với độ lệch chính xác.


0

Tôi đã gặp sự cố khi sử dụng Moment Timezone . Tôi đang thêm câu trả lời này chỉ để nếu người khác đối mặt với cùng một vấn đề. Vì vậy, tôi có một chuỗi ngày 2018-06-14 13:51:00đến từ của tôi API. Tôi biết rằng cái này được lưu trữ trongUTC nhưng chuỗi không nói cho chính nó.

Tôi cho múi giờ biết, múi giờ này là từ ngày nào:

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

Bây giờ tôi muốn chuyển đổi nó thành múi giờ cụ thể bằng cách thực hiện:

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.

0

Chỉ cần đặt múi giờ quốc gia mong muốn của bạn và Bạn có thể dễ dàng hiển thị trong html mà nó cập nhật bằng hàm SetInteval () sau mỗi một phút. chức năng định dạngAMPM () quản lý định dạng 12 giờ và hiển thị thời gian AM / PM.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });

-1

Tôi không biết một phương pháp dễ dàng để chuyển đổi một đối tượng ngày thành bất kỳ múi giờ nào, nhưng nếu bạn muốn chuyển đổi nó thành múi giờ địa phương, bạn có thể chuyển đổi nó Date.prototype.getTime()thành số mili giây tương ứng và quay lại.

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

Ví dụ, date.getHours()bây giờ sẽ trở lại 15thay vì 13nếu bạn, như tôi, ở Áo (và đó là mùa hè).

Tôi đã đọc rằng các hàm datetime khác nhau có thể thể hiện hành vi không chuẩn trong một số trình duyệt, vì vậy hãy kiểm tra điều này trước. Tôi có thể xác nhận rằng nó hoạt động trong Chrome.


1
Tại sao điều này được bỏ phiếu xuống? Đây là cách dễ nhất và tốt nhất để làm điều này. Hầu hết các câu trả lời ở trên không xem xét thời gian mùa hè / mùa đông
MortenSickel

Điểm của dòng thứ hai là gì? Hàm tạo ngày giả định múi giờ địa phương của bạn đã có. Cả hai dòng này trả về một ngày trong múi giờ của trình duyệt cục bộ và không trả lời câu hỏi về cách chuyển đổi sang múi giờ khác với thời gian tiết kiệm ánh sáng ban ngày.
Chloe

-1

Offset múi giờ cho múi giờ hiện tại của bạn

date +%s -d '1 Jan 1970'

Đối với GMT + 10 múi giờ (Úc) của tôi, nó đã trả về -36000


-1

Một cách tiếp cận có thể tính toán Offset cho Timezone mới tại thời điểm cụ thể.

Không chính xác giải pháp trực tiếp cho câu hỏi này, nhưng trong trường hợp sử dụng của tôi, tôi cần làm toán với thời gian kết quả không thể thực hiện được với đầu ra Chuỗi. Tôi sẽ chỉ để lại chức năng ở đây cho mọi người.

Đây chỉ là logic cốt lõi hoạt động trong Node và các trình duyệt hiện đại chính.

function getTimezoneOffset(unixtime, timezone){

  // Convert Unix Time to Data Object
  var date = new Date(unixtime * 1000);


  // Define Options for Formatter
  var options = {
    year: 'numeric', month: 'long', day: '2-digit',
    hour: '2-digit', minute: '2-digit', second: '2-digit',
    timeZone: timezone
  };

  // Get Date in New Timezone
  var new_date_string = Intl.DateTimeFormat(void 0, options).format(date); // Output: May 15, 2020, 02:40:12 AM


  // New Time in Seconds with Error-Fix for Date Conversion
  var time_with_fix = (
    ( new Date(new_date_string) ).getTime() / 1000 - // Convert Date into Seconds (In Local Timezone)
    ( new Date().getTimezoneOffset() * 60 ) // Local Timezone Offset in Seconds
  );


  // Return Timezone Offset
  return ( time_with_fix - unixtime ); // Return Offset in Seconds

};


///////////////////////////TEST/////////////////////////////////
var current_time = Math.floor( new Date().getTime()/1000 ); 
console.log(
  "getTimezoneOffset(current_time, 'America/New_York'):",
  getTimezoneOffset(current_time, 'America/New_York')/3600
);
console.log(
  "getTimezoneOffset(current_time, 'Australia/Sydney'):",
  getTimezoneOffset(current_time, 'Australia/Sydney')/3600
);


-6

thay đổi giờ thủ công nhanh chóng và bẩn thỉu và trở về:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()

quá bẩn (và quá lộn xộn)
Maxwell sc
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.