Sunucudan bu biçimde bir datetime değişkeni alıyorum: 6/29/2011 4:52:48 PM
ve UTC saatinde. JavaScript kullanarak mevcut kullanıcının tarayıcı saatine dönüştürmek istiyorum.
Bu JavaScript veya jQuery kullanılarak nasıl yapılabilir?
Sunucudan bu biçimde bir datetime değişkeni alıyorum: 6/29/2011 4:52:48 PM
ve UTC saatinde. JavaScript kullanarak mevcut kullanıcının tarayıcı saatine dönüştürmek istiyorum.
Bu JavaScript veya jQuery kullanılarak nasıl yapılabilir?
Yanıtlar:
Javascript'teki bir tarihe dönüştürmeden önce dizeye 'UTC' ekleyin:
var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
!
Dikkat !
_ ... date Tarih yapıcısı ile dizeleri ayrıştırma (ve Date.parse, bunlar eşdeğerdir) şiddetle ... dolayı tarayıcı farklılıkları ve tutarsızlıklar nedeniyle de tavsiye edilmez (muhtemelen daha doğrudur 2011'de olduğu)
Benim açımdan, sunucular her zaman genel durumda standart ISO 8601 biçiminde bir datetime dönmelidir .
Daha fazla bilgi burada:
Bu durumda, sunucu '2011-06-29T16:52:48.000Z'
doğrudan JS Date nesnesine beslenecek olan döndürür .
var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);
localDate
Benim durumumda iki saat sonra (DK süresi) olacaktır doğru yerel saatte olacak.
Sen gerçekten sürece sunucudan ne olacağını biçimi ile tutarlı olarak, hepsi sadece şeyler karmaşıklaştırır bu ayrıştırma yapmak gerekmez.
DateTime
nesneyi .toString("o")
biçimlendirebilirsiniz. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx Javascript'te bu new Date().toISOString()
. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Bu evrensel bir çözümdür:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);
var offset = date.getTimezoneOffset() / 60;
var hours = date.getHours();
newDate.setHours(hours - offset);
return newDate;
}
Kullanımı:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
İstemcinin yerel ayarını temel alarak tarihi görüntüleyin:
date.toLocaleString();
Benim için yukarıdaki çözümler işe yaramadı.
IE ile UTC tarih-saat dönüşüm yerel biraz zor. Benim için, web API tarih-tarihi '2018-02-15T05:37:26.007'
ve yerel saat dilimi başına dönüştürmek istedim, bu yüzden JavaScript kodu aşağıda kullandım.
var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
Bu işlevi kafanıza koyun:
<script type="text/javascript">
function localize(t)
{
var d=new Date(t+" UTC");
document.write(d.toString());
}
</script>
Ardından, sayfanızın gövdesindeki her tarih için aşağıdakileri oluşturun:
<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
GMT ve saat dilimini kaldırmak için aşağıdaki satırı değiştirin:
document.write(d.toString().replace(/GMT.*/g,""));
Bu benim için çalışıyor:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
Burada iyi sonuçlar olmadan yayınlanmış birkaç kişiyi denedikten sonra, bu benim için işe yaramış gibi görünüyordu:
convertUTCDateToLocalDate: function (date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
Ve bu, Yerel Tarih'ten UTC'ye ters yönde gitmek için çalışır:
convertLocalDatetoUTCDate: function(date){
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)
Zaman dilimini sonuna ekleyin, bu durumda 'UTC':
theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
bundan sonra , tarihi doğru yerde görüntülemek için toLocale () * işlev ailelerini kullanın
theDate.toLocaleString(); // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString(); // "9:52:48 AM"
theDate.toLocaleDateString(); // "6/29/2011"
Matt'in cevabı, yaz saati uygulamasının Date () ile dönüştürmesi gereken tarih saati arasında farklı olabileceği gerçeğini kaçırıyor - işte benim çözümüm:
function ConvertUTCTimeToLocalTime(UTCDateString)
{
var convertdLocalTime = new Date(UTCDateString);
var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;
convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset );
return convertdLocalTime;
}
Ve hata ayıklayıcıdaki sonuçlar:
UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
//Covert datetime by GMT offset
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
date = new Date(date);
//Local time converted to UTC
console.log("Time: " + date);
var localOffset = date.getTimezoneOffset() * 60000;
var localTime = date.getTime();
if (toUTC) {
date = localTime + localOffset;
} else {
date = localTime - localOffset;
}
date = new Date(date);
console.log("Converted time: " + date);
return date;
}
Bu, Adorjan Princ'in cevabına dayanan basitleştirilmiş bir çözümdür:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date);
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return newDate;
}
Kullanımı:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
Kullanmanın sakıncası yoksa moment.js
ve zamanınızın UTC olması durumunda aşağıdakileri kullanmanız yeterlidir:
moment.utc('6/29/2011 4:52:48 PM').toDate();
zamanınız utc içinde değil, sizin için bilinen başka bir yerel ayar ise aşağıdakileri kullanın:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
Zamanınız zaten yereldeyse, aşağıdakileri kullanın:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
Bana göre en basiti
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
(ilk satırın yeterli olabileceğini düşündüm ama saat kesirlerde kapalı olan zaman dilimleri var)
new Date('date string')
ve sonra bu iki satırı ekledim ve sunucunun UTC zaman damgasını tamamen temel alan bir zamanla geri geliyor gibi görünüyor kullanıcının yerel saatiyle eşleşmesi için yapılan ayarlamalarla. Ben de bir saat tuhaf kesirler hakkında endişelenmek zorunda ... Her zaman mükemmel tutar emin değilim ...
Bir JSON tarih dizesi (C # ile serileştirilmiş) "2015-10-13T18: 58: 17" gibi görünür.
Açısal olarak (Hulvej'i takip ederek) bir localdate
filtre yapın:
myFilters.filter('localdate', function () {
return function(input) {
var date = new Date(input + '.000Z');
return date;
};
})
Ardından, yerel saati şu şekilde görüntüleyin:
{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
YYYY-MM-DD hh:mm:ss
Biçimi kullanma :
var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Biçimden dönüştürmek için, YYYY-MM-DD hh:mm:ss
tarihinizin ISO 8601 biçimini izlediğinden emin olun .
Year:
YYYY (eg 1997)
Year and month:
YYYY-MM (eg 1997-07)
Complete date:
YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second
YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:
YYYY = four-digit year
MM = two-digit month (01=January, etc.)
DD = two-digit day of month (01 through 31)
hh = two digits of hour (00 through 23) (am/pm NOT allowed)
mm = two digits of minute (00 through 59)
ss = two digits of second (00 through 59)
s = one or more digits representing a decimal fraction of a second
TZD = time zone designator (Z or +hh:mm or -hh:mm)
Dikkat edilmesi gereken önemli noktalar
T
bazı tarayıcılarda boşluk çalışmaz+hh:mm
için bir dize kullanarak ayarlamanız gerekir (ör: 'UTC') birçok tarayıcıda çalışmaz. +hh:mm
UTC saat diliminden farkı temsil eder.@Adorojan's
cevap neredeyse doğrudur. Ancak ofset eklenmesi doğru değildir çünkü tarayıcı tarihi GMT'nin önünde ise ofset değeri negatif olacaktır veya tersi de geçerlidir. Aşağıda geldiğim çözüm benim için gayet iyi çalışıyor:
// Input time in UTC
var inputInUtc = "6/29/2011 4:52:48";
var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
//Print date in UTC time
document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");
var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
//Print date in local time
document.write("Date in Local : " + dateInLocalTz.toISOString());
function convertUtcToLocalTz(dateInUtc) {
//Convert to local timezone
return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
}
I Bu Yanıtlanıyor Herhangi biri, belirli bir id öğesine dönüştürülen zamanı görüntüleyen ve burada tarih biçimi dizesini uygulayan bir işlev istiyorsa yyyy-aa-gg burada date1 dizgi ve ids görüntülenecek öğenin kimliğidir.
function convertUTCDateToLocalDate(date1, ids)
{
var newDate = new Date();
var ary = date1.split(" ");
var ary2 = ary[0].split("-");
var ary1 = ary[1].split(":");
var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
newDate.setUTCHours(parseInt(ary1[0]));
newDate.setUTCMinutes(ary1[1]);
newDate.setUTCSeconds(ary1[2]);
newDate.setUTCFullYear(ary2[0]);
newDate.setUTCMonth(ary2[1]);
newDate.setUTCDate(ary2[2]);
ids = document.getElementById(ids);
ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
}
Ben cevap zaten kabul edildi biliyorum ama ben burada google neden olsun ve ben sadece birisi gerekiyorsa paylaşmak istiyorum bu yüzden kabul edilen cevap ilham alma ile çözmek yaptı.
@Digitalbath yanıtına dayanarak, UTC zaman damgasını almak ve belirli bir DOM öğesinde yerel saati görüntülemek için küçük bir işlev (bu son bölüm için jQuery kullanarak):
https://jsfiddle.net/moriz/6ktb4sv8/1/
<div id="eventTimestamp" class="timeStamp">
</div>
<script type="text/javascript">
// Convert UTC timestamp to local time and display in specified DOM element
function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);
}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
</script>
Bir UTC dönemi alır ve istemci sistem saat dilimi dönüştürür ve d / m / YH: i: s (PHP tarih işlevi gibi) biçiminde döndürür güzel küçük bir komut dosyası yazdım:
getTimezoneDate = function ( e ) {
function p(s) { return (s < 10) ? '0' + s : s; }
var t = new Date(0);
t.setUTCSeconds(e);
var d = p(t.getDate()),
m = p(t.getMonth()+1),
Y = p(t.getFullYear()),
H = p(t.getHours()),
i = p(t.getMinutes()),
s = p(t.getSeconds());
d = [d, m, Y].join('/') + ' ' + [H, i, s].join(':');
return d;
};
Momentjs kullanabilirsiniz , moment(date).format()
her zaman yerel tarihte sonuç verecektir .
Bonus , istediğiniz şekilde biçimlendirebilirsiniz. Örneğin.
moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd'); // Friday
moment().format("MMM Do YY");
Daha fazla bilgi için Moment js web sitesine bakabilirsiniz
Moment.js dosyasını kullanarak bunu yapabilirsiniz .
Onun basit sadece zaman dilimi yeri bahsetti.
Örnek: Tarih saatinizi Asia / Kolkata saat dilimine dönüştürürseniz, moment.js'den alınan saat dilimi yerinin adını belirtmeniz gerekir.
var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
Tüm zaman dilimlerini yerel saate dönüştüren bir işlev oluşturdum.
Uygun ofset değeri döndürmediği için getTimezoneOffset () kullanmadım
Gereksinimler:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
Benim durumumda, saniye cinsinden tarihler arasındaki farkı bulmak zorundaydım. Tarih bir UTC tarih dizesiydi, bu yüzden yerel bir tarih nesnesine dönüştürdüm. Ben de öyle yaptım:
let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() *
60000);
utc2 = dateForCompare;
const seconds = Math.floor(utc1 - utc2) / 1000;
function getUTC(str) {
var arr = str.split(/[- :]/);
var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
return utc;
}
Ziyaret eden diğer kişiler için - UTC işlevinden bir Yerel tarih nesnesi almak için bu işlevi kullanın, DST ile ilgilenmeli ve IE, IPhone vb.
Dizeyi böldük (JS Tarih ayrıştırma bazı tarayıcılarda desteklenmediğinden) UTC'den fark alıyoruz ve yerel saat veren UTC saatinden çıkarıyoruz. Döndürülen ofset DST (yanlışsam beni düzelt) ile hesaplandığından, bu zamanı "utc" değişkenine geri ayarlayacaktır. Son olarak tarih nesnesini döndür.
Angular'da Ben'in cevabını şu şekilde kullandım:
$scope.convert = function (thedate) {
var tempstr = thedate.toString();
var newstr = tempstr.toString().replace(/GMT.*/g, "");
newstr = newstr + " UTC";
return new Date(newstr);
};
Düzenleme: Açısal 1.3.0 tarih filtresine UTC desteği eklendi, henüz kullanmadım ama daha kolay olmalı, işte format:
{{ date_expression | date : format : timezone}}