UTC tarih saatini yerel tarih saatine dönüştürme


337

Sunucudan bu biçimde bir datetime değişkeni alıyorum: 6/29/2011 4:52:48 PMve 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?



1
Dikkatli ol. Bu garip bir tarih biçimidir, bu yüzden kullandığınız çözümde belirttiğinizden emin olun. Mümkünse, sunucunun tarihi ISO biçiminde göndermesini sağlayın.
Michael Scheper

Yanıtlar:


404

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

5
işlev localizeDateStr (date_to_convert_str) {var date_to_convert = yeni Tarih (date_to_convert_str); var local_date = yeni Tarih (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); dönüş tarihi_konusu.toString (); }
matt

4
Saatleri değil, dakikaları döndürür, 60'a bölmeniz gerekir
bladefist

50
Bu, dizenin tarih bölümünün ABD standardı olan mm / dd / YYYY'yi izlediğini varsayar; bu, Avrupa'da ve dünyanın diğer bölgelerinde geçerli değildir.
AsGoodAsItGets

7
@digitalbath Chrome'da çalışır, ancak Firefox'ta çalışmaz.
Ganesh Satpute


138

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

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


1
iso format tarihi nasıl alınır? UTC biçiminde sona ekli UTC ile tarih alıyorum
Deepika

8
@ Bu dile bağlı olan coolin. C # 'da, yukarıda gösterildiği gibi ISO-8601 biçimli bir dize döndüren bir DateTimenesneyi .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/…
Hulvej

99

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();

41
Tüm saat dilimlerinde çalışmaz. GetTimeZoneOffset'in birkaç dakika içinde olmasının iyi bir nedeni var! geographylists.com/list20d.html
siukurnin

5
@siukurnin. tuhaf saat dilimini yönetmek için newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre

18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) yeterli olacaktır. Saati de düzeltir
Lu55

1
Bunun 30 dakika süren herhangi bir saat diliminde çalışamayacağından emin misiniz? Saatlerce gibi görünüyor.
NickG

2
Bu aynı zamanda saat dilimi gece yarısı geçtiği tarihi doğru ayarlamıyor gibi görünüyor; muhtemelen sadece tarihi etkilemeyen setHours kullandığından?
Uniphonic

37

İstemcinin (UTC) farkını (dakika cinsinden) almalısınız:

var offset = new Date().getTimezoneOffset();

Ve sonra sunucudan aldığınız zamana karşılık gelen ekleme veya çıkarma yapın.

Bu yardımcı olur umarım.


2
DST ne olacak?
Zengin

26

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');

21

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,""));

20

Bu benim için çalışıyor:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}

10

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());
}

1
Kullanmak için daha az kod new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

işe yaramayacak, utc'deki zamanım "2020-04-02T11: 09: 00", bunu Singapur'dan denedi, yeni Tarih (+ yeni Tarih ("2020-04-02T11: 09: 00") + yeni Tarih ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), yanlış zaman veriyor
AhammadaliPK

bu işe yaradı, yeni Tarih ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK

10

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"

9

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)

9

UTC ve Yerel saat dönüşümü için bunu kullanın.

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

3
gün ışığından yararlanma anında ne oldu. CET zaman dilimi
NovusMobile


9

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

Bu neden 9 Ekim 2017'de indirildi? Lütfen fikrinizi anlamama yardımcı olacak bir yorum yazın.
huha

9

Kullanmanın sakıncası yoksa moment.jsve 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');

5

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)


Bununla ilgili herhangi bir sorunu olan var mı? Bu benim için en iyi seçenek gibi görünüyor. Sonunda "(UTC)" olan bir UTC dizesi aldım, kullanarak bir Date nesnesi olarak ayarladım 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 ...
tylerl

diğer birçok seçeneği denedim, hiçbiri işe yaramadı, ama bu çalışıyor
Sameera K

5

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 localdatefiltre 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' }}

3

YYYY-MM-DD hh:mm:ssBiç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:sstarihinizin 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

  1. Tarihi ve saati a ile ayırmalısınız, Tbazı tarayıcılarda boşluk çalışmaz
  2. Saat dilimini bu biçimi kullanarak, saat dilimi +hh:mmiçin bir dize kullanarak ayarlamanız gerekir (ör: 'UTC') birçok tarayıcıda çalışmaz. +hh:mmUTC saat diliminden farkı temsil eder.

3

@Adorojan'scevap 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);
}


3

Benim için bu iyi çalışıyor

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}

2

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


1

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

0

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;

};

0

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


0

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');


0

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"

0

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;

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


-1

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

Açısal 1.4.3 Tarih API'sı

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.