JavaScript'te tarihi başka bir saat dilimine dönüştürme


336

Bir zaman diliminde tarihi diğerine dönüştürmek için bir işlev arıyorum.

İki parametreye ihtiyacı var,

  • tarih ("2012/04/10 10:10:30 +0000" biçiminde)
  • saat dilimi dizesi ("Asya / Jakarta")

Saat dilimi dizesi http://en.wikipedia.org/wiki/Zone.tab adresinde açıklanmıştır.

Bunu yapmanın kolay bir yolu var mı?


1
Belirli bir şehrin UTC farkını bulun. stackoverflow.com/questions/3002910/…
Brandon Boone

3
Sadece UTC ofsetini değil, aynı zamanda Yaz saati / yaz saatini de hesaplamak istiyorum. Böylece zaman doğru dönecektir.
Rizky Ramadhan



Unix date komutunu kullanarak saat diliminizi ayarlayın: tarih +% s -d '1 Oca 1970'
anthony

Yanıtlar:


191

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
Bunun cevabını değiştirdim, çünkü bu herhangi bir kütüphane kullanmadan doğru ve standart bir yöntem.
Rizky Ramadhan

5
MDN belgeleri açıkça tüm uygulamalarda tanınması gereken tek saat diliminin UTC olduğunu belirtmektedir. ( stackoverflow.com/questions/10087819/… ) IE11'de [Kod snippet'ini çalıştır] düğmesine tıklamak hata veriyor.
Vivian River

1
Herkes şu anda tüm tarayıcı için çalışan bir uygulama arayan, kendi eksilerini ile aşağıdaki herhangi bir cevap deneyebilirsiniz ...
Rizky Ramadhan

14
Bu yanıt, bir saat diliminin doğru bir şekilde geçmesini gösterir toLocaleString, ancak daha sonra bu dizeyi yapıcıya geri aktarmayı çok yanlış gösterir Date. Bu bela istiyor. Tarih dizesi ayrıştırıcısının yerel ayara özgü biçimleri kabul etmesi gerekmez ve giriş, yerel saat dilimindeymiş gibi işlenir. Bunu yapma. Sadece ilk toLocalStringçağrıdan dize çıktısını kullanın .
Matt Johnson-Pint

4
@MattJohnson sonra getHour () veya bu tür yöntemleri
kullanamazsınız

131

İçin moment.js kullanıcılar, artık kullanabilirsiniz an-dilimini . Bunu kullanarak, fonksiyonunuz şöyle görünecektir:

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

3
Nasıl yeni zaman dilimleri ekleyeceğimi bilmiyordum, dokümanlar bana yardımcı olmadı. Ben sadece programcıyım, zaman uzmanı değil!
Parziphal

8
Buradaki sorun, bunun yeni bir Date nesnesi döndürmemesi, bir dize döndürmesidir. Eğer istediğin buysa, bu elbette iyi.
nickdnk

2
"Dönüş momenti (zaman) .tz (bölge) .format (format);" değil mi? ? Kodunuzda verdiğiniz kodda "Geçersiz Tarih" hatası var.
Tarek

1
Moment.js dosyasını tarayıcıya yüklemek mümkün değildir. Çok üzücü :(
Daniil Shevelev

4
Tz veritabanının bir kopyasıyla tarayıcıya 180K göndermekten memnun değilseniz ve eski tarayıcılarda geçerli saat dilimine göre bozulma ile yaşayabiliyorsanız, @ lambinator'un yanıtını deneyin Date.prototype.toLocaleString.
Peter V.Mørch

92

Utanmadan çalındı: 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();
}

bu işlev bir şehir / ülke adı ve ofset değeri sağlayarak saat dilimi değerini hesaplamak için yararlıdır


4
güzel .... ama sanırım ofset onun şehirde geçti dayalı onun için aranmasını istiyor.
Brandon Boone

117
Bu, gün ışığından yararlanma değişikliklerini dikkate almaz.
Robotbugs

12
soruyu cevaplamıyor ama benimkini cevaplıyor (+1)
Reign.85

Bu '3600000' tam anlamıyla beni öldürdü! Girişte tz saat cinsinden verilmelidir! Ve çıkarılmalıdır. Yani, geçerseniz: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Aynı zamanı geri vermeli.
Praveen

1
Bu yanıt ciddi bir şekilde güncelliğini yitirmiştir ve özellikle de farklı bir saat dilimine kaydırıldığında ana bilgisayar saat dilimini bildirecek olan toLocaleString kullanan bölüm kaldırılmalıdır . Farklı ofsetler için manuel olarak zaman damgaları oluşturmanın çok daha iyi yolları vardır.
RobG

89

Safari dışındaki çoğu masaüstü (mobil değil) tarayıcı toLocaleString işlevini bağımsız değişkenlerle destekler, eski tarayıcılar genellikle bağımsız değişkenleri yok sayar .

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

4
Firefox ve Edge'de başarısız oluyor :(
Šime Vidas

10
Bu FF ve IE11 + 'da başarısız olduğu için başka bir çözüm bulunması gerekiyor.
jdavid.net

2
Edge and chrome bunu beğendi :)
Suhail Mumtaz Awan

6
Şimdi Android v59'da Chrome v59 ve Firefox masaüstü v54 ve Chome'da ve iOS 10.3'te Safari 10'da çalıştı. IE10'da çalışmadı. MDN'nin Date.prototype.toLocaleString () açıklaması,toLocaleStringSupportsLocales() desteği güvenilir bir şekilde kontrol etmenizi sağlayan bir uygulamaya sahiptir.
Peter V.Mørch

1
Node.js v8.7.0
Heinrich Ulbricht

56

Tamam, buldum!

Saat dilimi-js kullanıyorum . bu kod:

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
Buna karşı oy vermek zorundayım, timezone-js DST'yi desteklemiyor ve bunu benioku dosyasında tanıtmıyor, bu da bunu arayan insanlar için kötü bir ipucu yapıyor. Bkz. Github.com/mde/timezone-js/issues/51 ve dosyalanmış ve düzeltilmemiş gibi görünen diğer bazı sorunlar.

@nus evet, ama gerçekten istemci tarafı saat dilimi / tarih yönetimi için bir çözüm yok ... jquery ui datepicker bu yüzden beni deli ediyor. şerefe
Lucas

2
@Marabunta, moment-zaman dilimi gibi görünüyor (Brian Di Palma'nın cevabı) DST'yi destekliyor github.com/moment/moment-timezone/issues/21
welldan97

2
TimezoneJS kullanmayın, DST değişiklikleri etrafında hata aldı.
matf

17

Bazı büyük kütüphaneleri içe aktarmak istemiyorsanız, Date nesnelerini farklı saat dilimlerine dönüştürmek için Intl.DateTimeFormat kullanabilirsiniz .

// 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

Ofsetler, gün ışığından yararlanma ve geçmişteki değişiklikler sizin için halledilecektir.


IE10 +, saat dilimleri için Intl API'sını desteklemez. moment.github.io/luxon/docs/manual/matrix.html
Chloe

Bu aslında en iyi cevap. toLocaleStringtutarsız bir uygulamaya sahiptir ve bu IE11'den itibaren çalışır.
dlsso

Bilginize: Bu aslında IE11'de, en azından Windows 8.1'de çalışmıyor. formatterNesneyi oluşturmaya çalıştığınızda , `` timeZone '' için `` Seçenek değeri 'Asia / Jakarta' 'geçerli aralığın dışında. Beklenen: ['UTC'] ``
veddermatic

biçimlendiriciden son sonucu tekrar bir Date nesnesine dönüştürmenin bir yolu var mı?
mding5692

10

Anladım !

Gösterilen tarihi zorlamak istedim = sunucu tarihi, yerel ayarlar (UTC) önemli değil.

Sunucum GMT-6 -> yeni Tarih (). GetTimezoneOffset () = 360.

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

2
Doğru naif zamanı göstermesine rağmen, myOldDateObj'den saat dilimi bilgileri tutulur. Yani aslında yanlış zamandır (zamanın örneğini zaman aldığınız zaman, saatin zamanını değil).
gabn88

@ gabn88: Javascript kullanarak sunucu saatini değiştiremezsiniz ... Sunucu saatini düzeltmek için işletim sistemi düzeyinde yapın.
Cedric Simon,

2
Sunucu saatini düzeltmem gerekmiyor;) Sunucu saati benim için her zaman UTC. Ama farklı zaman dilimlerinde farklı organizasyonlarım var. Cihazları, nerede olurlarsa olsunlar, kuruluşlarının nereye yerleştirildiğini her zaman göstermelidir.
gabn88

Tarihler hep X saat dilimini gösterme konusunda benzer bir sorun var. Tüm tarihleri ​​sunucudan dize biçiminde göndermeye çalışıyoruz ve tarayıcıda sadece yerel saat dilimi tarihleri ​​olarak ele alıyoruz.
Venkateswara Rao

5

Saat dilimini ayarlamak için toLocaleString () yöntemini kullanabilirsiniz.

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

Hindistan için "Hint / Noel" kullanabilirsiniz ve aşağıdakiler çeşitli saat dilimleridir,

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

TimeZone'u ayarlamıyorsunuz, daha ziyade o timeZone'da ifade edilen zamana sahip bir dize üretiyorsunuz. Tarih aynı kalır.
Gerard ONeill

toLocaleStringSolüsyon edildi zaten 4 yıl önce verilmiş .
Dan Dascalescu

4

Sadece dönüştürme saat dilimleri gerekirse ben yükledik soyulmuş aşağı versiyonu ait anı-diliminin sadece çıplak asgari ile işlevsellik ile. ~ 1KB + verileri:

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

Yıl, ay ve gün ile '-' sembolleri, artı 'T' ve SS: dd: ss biçiminde saat ve ardından dizenin sonunda +01: 00 ile ayrılmış bir değişken ayarlayın (benim durumumda saat dilimi +1'dir). Ardından, tarih oluşturucusu için bağımsız değişken olarak bu dizeyi kullanın.

//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

Hangi harici kütüphaneleri kullanabileceğim konusunda kısıtlı olduğumu belirtmeliyim. moment.js ve timezone-js benim için bir seçenek değildi.

Sahip olduğum js tarih nesnesi UTC'dir. Belirli bir saat diliminde (benim durumumda 'Amerika / Chicago') bu tarihten tarihi ve saati almam gerekiyordu.

 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 şu anda 'Amerika / Chicago'dan 6 saat ileridedir. Çıktı:

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

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

11
new Date();Yerel saat dilimi dönmek değil, UTC
Mirko

1
belgelerden:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko

Hmm. Biraz kafa karıştırıcı. Bu bir tarihte saat dilimini değiştirmez; bunun yerine değişen saatlerle yeni bir tarih oluşturur. Olacağını çok toLocaleString çağrısından oluşturulan dizesinden istediğiniz değerleri ayıklamak için normal bir ifade kullanmak daha net.
Gerard ONeill

2

İşte benim kod, mükemmel çalışıyor, aşağıda demo vermek ile deneyebilirsiniz:

$(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>


StackOverflow'a hoş geldiniz! Bu kodun nasıl çalıştığı ve ne işe yaradığı gibi daha fazla bilgi sağlayabilir misiniz? Sorunu nasıl düzeltir?
DarkSuniuM

Yukarıdaki kodum, saat diliminizi diğer ülkelerin saat dilimine güncellemektir.
Sahil Kapoor

HTML'yi html dosyanıza koymanız ve yukarıda verilen jquery kodunun altbilgide olması gerekir. Sizin için çalışacaktır ('tr-US', {timeZone: 'America / Chicago'}), diğer ülkelerin saat dilimini istiyorsanız bu iki değeri güncellemeniz gerekir Teşekkürler
Sahil Kapoor

Hayır bekle. Dikkatlice bakmadan bunu iptal ettim. Neden 1 ekliyorsunuz currentDateTimeCentralTimeZone.getHours()? Bu olmadan işe yarayacaktı ve 27'nin cevabını aramakla aynı olacak stackoverflow.com/a/40809160/1404185
chetstone

1

Bunu, tarih dilimini Hindistan'a dönüştürmek için de deneyebilirsiniz:

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
2. adımdan sonra ben Hindistan'da zaman olsun ... öyleyse neden hala 5 & 1 / 2hrs ekliyorsunuz?
user3833732

Bu yöntemi kullanırken, Chrome ile günlüğü konsollarken Norveç'te aşağıdakileri elde ediyorum: Orijinal: Per Eylül 27 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Değiştirildi: Per 27 Eyl 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). “Sentraleuropeisk sommertid” Orta Avrupa Yaz Saati anlamına gelir. Hindistan için yaz saatine ihtiyacınız olduğunda ya da Hindistan'da olduğunuzda ve Avrupa için yaz saatine ihtiyacınız olduğunda bunun işe yarayıp yaramayacağından emin değilim.
Kebman

Bunun gibi setHours () kullanılması gün, ay, yıl geçişlerini hesaba katmaz, örneğin 8'de Yeni Dell'de saat 3:30, Londra'da 7'de 11:00. Sonra ayın, yılın ve artık günlerin sonunu düşünün. Date bunu yapmak matematik <pre> izin local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); let date_str = local_time.toISOString (). dilim (0, 10); let time_str = local_time.toISOString (). dilim (11, -1); let timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland

1

Bu sayfadaki bağlantılar da dahil olmak üzere çok etrafa baktığımda, anın saat dilimini kullanarak bu harika makaleyi buldum:

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

Özetlemek gerekirse:

Kullanıcının saat dilimini alın

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

Örneğin, Saat Dilimi: Avrupa / Londra

Varsayılan kullanıcı saat dilimini ayarlama

moment.tz.setDefault(tz);

Özel saat dilimi ayarlama

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

Tarih / saati yerel saat dilimine dönüştür, orijinal tarih / saatin UTC olduğunu varsayar

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

İade: 25 Aralık 2016 Pazar, 07:00

Tarihi / saati LA Saatine dönüştürme

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

İade: Cumartesi, 24 Aralık 2016, 23:00

Dönüştürmek LA zamandan Londra

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

İade: Paz, 25 Aralık 2016, 15:00



0

bunun için kullanabileceğiniz 'timezones.json' adında bir npm modülü var; temelde gün ışığından yararlanma ve ofset hakkında bilgi içeren nesnelerle bir json dosyasından oluşur ....

asya / jakarta için bu nesneyi döndürebilir:

{
  "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"
  ]
}

burada bulabilirsiniz:

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

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

umarım faydalıdır


0

Java 8 java.timepaketini bilen veya joda-timemuhtemelen bloktaki yeni çocuğu sevecek: js-joda kütüphanesi.

Yüklemek

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

Misal

<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>

Gerçek java doğada, oldukça ayrıntılı lol. Ancak, ported bir java kütüphanesi olmak, özellikle 1800'ish test senaryolarını taşıdıklarını düşünürsek, muhtemelen mükemmel bir şekilde doğru çalışır.

Chrono manipülasyonu zor. Bu yüzden diğer birçok kütüphane uç durumlarda buggy. Moment.js, zaman dilimlerini doğru buluyor gibi görünüyor, ancak gördüğüm diğer js libs timezone-jsgüvenilir görünmüyor.


0

Son zamanlarda bu yazı tipinde yaptım:

// 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;
}

Basit bir format olduğu için "en-UK" biçimini kullanıyorum. "Tr-tr" ya da her neyse işe yarayabilirdi.

İlk argüman yerel saat diliminiz ve seconde hedef saat diliminizse, doğru ofsetli bir Date nesnesi döndürür.


0

Moment Timezone'u kullanırken sorun yaşıyordum . Bu yanıtı, başka biri aynı sorunla karşı karşıya kalırsa ekliyorum. Yani 2018-06-14 13:51:00benim gelen bir tarih dizesi var API. Bu saklanır biliyorum UTCama dize kendisi için konuşmuyor.

Şu an saat dilimi, bu tarihin hangi saat dilimi yaparak olduğunu biliyorum:

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

Şimdi yaparak belirli bir zaman dilimine dönüştürmek istiyorum:

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

İstediğiniz ülke saat dilimini ayarlayın ve her bir dakikadan sonra SetInteval () işlevini kullanarak güncellenmesini html olarak kolayca gösterebilirsiniz. AMM () 12 saatlik formatı ve AM / PM zaman göstergesini yönetir.

$(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

Bir tarih nesnesini herhangi bir saat dilimine dönüştürmek için kolay bir yöntem bilmiyorum, ancak yerel saat dilimine dönüştürmek istiyorsanız, sadece Date.prototype.getTime()karşılık gelen milisaniye sayısına dönüştürebilirsiniz ve tekrar geri.

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

Örneğin, date.getHours()şimdi 15yerine dönecek13 Avusturya'da, benim gibi, eğer (ve 's yaz).

Çeşitli datetime işlevlerinin bazı tarayıcılarda standart olmayan davranışlar gösterebileceğini okudum, bu yüzden önce bunu test edin. Chrome'da çalıştığını onaylayabilirim.


1
Bu neden oylandı? Bu, bunu yapmanın en kolay ve en iyi yoludur. Yukarıdaki cevapların çoğu yaz / kış zamanını dikkate
almaz

İkinci çizginin amacı nedir? Tarih yapıcısı yerel saat diliminizi zaten varsayar. Bu satırların her ikisi de yerel tarayıcı saat diliminde bir tarih döndürür ve gün ışığından yararlanma saati ile başka bir saat dilimine nasıl geçileceği sorusunu yanıtlamaz.
Chloe

-1

Geçerli saat diliminiz için Saat Dilimi Dengesi

date +%s -d '1 Jan 1970'

GMT + 10 saat dilimim için (Avustralya) -36000


-6

hızlı ve kirli manuel saat değiştirici ve dönüş:

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

çok kirli (ve çok dağınık)
Maxwell sc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.