it-swarm-tr.com

Tarih/saati kullanıcının yerel biçiminde ve saat ofsetinde görüntüleme

Sunucunun HTML’deki UTC’de her zaman tarih sunmasını ve istemci sitesinde JavaScript’i kullanıcının yerel saat dilimine dönüştürmesini istiyorum.

Kullanıcının yerel tarih biçiminde çıkış yapabilirsem Bonus.

145
kch

UTC tarihiyle başlamanın en kolay yolunun, yeni bir Date nesnesi oluşturmak ve onu istediğiniz tarih/saate ayarlamak için setUTC… yöntemlerini kullanması gibi görünüyor.

Daha sonra çeşitli toLocale…String yöntemleri yerelleştirilmiş çıktı sağlayacaktır.

Örnek:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

Bazı referanslar:

148
kch

Yeni projeler için, sadece moment.js kullanın

Bu soru oldukça eski, yani o zaman moment.js yoktu, ancak yeni projeler için bu gibi işleri çok kolaylaştırıyor. 

Tarih dizinizi UTC’den ayrıştırma ’a aşağıdaki gibi ekleyin (tüm tarayıcılarda tutarlı sonuçlar almak için sunucuda bir ISO-8601 uyumlu bir dize oluşturun)

var m = moment("2013-02-08T09:30:26Z");

Şimdi uygulamanızdaki m işlevini kullanın, moment.js varsayılan görüntüleme işlemleri için yerel saat dilimine döner. Tarih ve saat değerlerini biçimlendirmenin birçok yolu vardır veya bölümlerini ayıklar.

Bir moment nesnesini kullanıcıların yerel ayarlarında şu şekilde bile biçimlendirebilirsiniz:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

Bir moment.js nesnesini farklı bir saat dilimine (yani ne yerel ne de UTC'ye) dönüştürmek için moment.js saat dilimi uzantısı gerekir. Bu sayfada ayrıca bazı örnekler var, kullanımı oldukça basit.

61
theDmi

Saat dilimi için new Date().getTimezoneOffset()/60 komutunu kullanabilirsiniz. Kullanıcının yerel ayarını kullanarak tarihi görüntülemek için toLocaleString() yöntemi de vardır.

İşte bütün liste: Tarihlerle Çalışma

19
jop

Date nesnesini oluşturduktan sonra, dönüşüm için bir pasaj aşağıdadır:

Fonksiyon UTC formatlı bir Date nesnesini ve format dizesini alır.
Bir Date.strftime prototipine ihtiyacınız olacaktır.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}
6
simianarmy

İşte eski projelerde kullandıklarım:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');
5
Mark

JS'de, her bir mülkü yukarıda belirtilen şekilde dönüştürmenin dışında, yerel tarih saatini biçimlendirmenin basit ve çapraz platform yolu yoktur. 

İşte yerel YYYY-AA-GG'yi almak için kullandığım hızlıca kesmek. Son tarih artık doğru bir zaman dilimine sahip olmayacağından bu bir kesmek olduğunu unutmayın (bu yüzden zaman dilimini yoksaymanız gerekir). Başka bir şeye ihtiyacım olursa, moment.js kullanıyorum. 

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

D.getTimezoneOffset (), saat dilimi uzaklığını dakika cinsinden döndürür ve d.getTime () ms cinsindendir, bu nedenle x 60,000'dir.

4
Jeremy Chone

.getTimezoneOffset() yöntemi, GMT/UTC saat diliminden "batıya doğru" sayarak zaman dilimi ofsetini dakika cinsinden rapor eder ve bu da genellikle alıştığı kişinin negatif olduğu bir ofset değeriyle sonuçlanır. (Örneğin, New York süresinin +240 dakika veya +4 saat olduğu bildirilir)

Saat cinsinden normal bir saat dilimi kayması elde etmek için kullanmanız gerekir:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

Önemli detay:
Gün ışığından yararlanma zamanının sonuca dahil edildiğine dikkat edin - bu yöntemin size verdiği gerçek coğrafi zaman dilimi sapma değil - zaman sapmadır.

3
Már Örlygsson

PHP kodundaki date ile böyle bir şey kullandım ..

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

Buna şöyle diyebiliriz

var localdateObj = getLocalDate('2015-09-25T02:57:46');
3
hriziya

Cevapları o ana kadar karıştırdım ve ekledim, çünkü hepsini okumak zorunda kaldım ve bir süre daha db'den gelen bir tarih saat dizgisini kullanıcının yerel saat dilimi biçiminde görüntülemek için araştırdım.

Datetime dizesi, bir python/Django db biçiminde gelir: 2016-12-05T15: 12: 24.215Z

Tarayıcı dilinin JavaScript'te güvenilir şekilde algılanması tüm tarayıcılarda işe yaramaz gibi görünüyor (bkz. tarayıcı dili tercihini belirlemek için JavaScript ), bu nedenle tarayıcı dilini sunucudan alıyorum.

Python/Django: istek tarayıcı dilini bağlam parametresi olarak gönder:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML: gizli bir girdiye yazınız:

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript: Gizli girişin değerini, örn. en-GB, en-US; q = 0.8, en; q = 0.6/ve ardından listedeki ilk dili yalnızca değiştirme ve düzenli ifade ile alma

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript: tarih saatine dönüştür ve formatla:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

Bakınız: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

Sonuç (tarayıcı dili en-gb'dir): 05/12/2016, 14:58

3
Anja

Karşılaştığım en iyi çözüm [time display = "llll" datetime = "UTC TIME" /] Etiketler oluşturmak ve kullanıcının zamanına göre ayrıştırıp görüntülemek için javascript (jquery) kullanmak.

http://momentjs.com/ Moment.js 

güzel zaman gösterecektir.

2
Daniel

Zaman dilimi kaymasını GMT'den dakika cinsinden bildiren aşağıdakileri kullanabilirsiniz: 

new Date().getTimezoneOffset();

Not : - bu fonksiyon negatif bir sayı döndürür.

2
dave

getTimeZoneOffset () ve toLocaleString, temel tarih çalışmaları için iyidir, ancak gerçek bir saat dilimi desteğine ihtiyacınız varsa, mde TimeZone.js dosyasına bakın. 

Cevaplarında tartışılan birkaç seçenek daha var: bu soru

1
Aeon

Tarihi yerel tarihe dönüştürmek için toLocaleDateString () yöntemini kullanın.

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

Saati yerel saate dönüştürmek için toLocaleTimeString () yöntemini kullanın.

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);
0
Codemaker

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);

0
Sergey