UTC Dönemini yerel tarihe dönüştür


274

Biraz bununla mücadele ediyorum. Dönemi bir tarih nesnesine dönüştürmeye çalışıyorum. Çağ bana UTC'de gönderilir. new Date()Bir çağı geçtiğinizde , bunun yerel çağ olduğunu varsayar. Bir UTC nesnesi oluşturmaya çalıştım, daha sonra setTime()uygun çağa ayarlamak için kullandım, ancak yararlı görünen tek yöntem toUTCString()ve dizeler bana yardımcı olmuyor. Bu dizeyi yeni bir tarihe geçirirsem, UTC olduğunu fark etmeliyiz, ama yapmaz.

new Date( new Date().toUTCString() ).toLocaleString()

Bir sonraki girişimim, yerel cari dönem ile UTC cari dönem arasındaki farkı elde etmeye çalışmaktı, ama bunu da başaramadım.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

Bana sadece 1000'den küçük, milisaniye cinsinden çok küçük farklılıklar veriyor.

Baska öneri?


11
Dönem süresi 1970 tarihinden beri geçen milisaniye olarak tanımlanır UTC . Yerel bir çağ diye bir şey yoktur! Sorununu anladığımdan emin değilim.
Chetan Sastry

Belki bilgisayardaki saat dilimi yanlıştır ve farklı bir UTC değerine neden olabilir?
kijin

2
ToLocaleString () öğesini kullandığınızda UTC saatini 'görmek' istiyorsanız, saatinizi UTC saatine ayarlamanız gerekir. Gece yarısı UTC saat 19: 00'da (EST). LocaleString yerine yeni Date (). ToString () kullanırsanız, ofseti içeren 'Cum Jan 07 2011 07:00:00 GMT-0500' gibi bir şey elde edersiniz.
kennebec

Yanıtlar:


466

Ben daha basit bir çözüm var düşünüyorum - dönemin ilk tarihini ayarlayın ve UTC birimleri ekleyin. Saniyeler içinde saklanan bir UTC dönemi varlığınız olduğunu varsayalım. Nasıl hakkında 1234567890. Bunu yerel saat diliminde uygun bir tarihe dönüştürmek için:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d şimdi (saat dilimimde) olarak ayarlanmış bir tarih Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


190
FWIW, Date nesneleri milisaniye ile başlatılabilir. Yani, var d = new Date(utcSeconds * 1000)aynı sonucu vermelidir.
kurttheviking

54
var d = new Date(1234567890000)aynı sonucu döndürür
Matjaz Lipus

11
belki başkaları birkaç noktadan netlik kazanabilirdi: date nesnesi "içinde damgalanmış" bir saat dilimi ile ayarlanmaz. bir sayıdan başka bir şey olarak düşünmeyin. bu sayı 1970 Ocak 1 UTC'den bugüne kadar olan milisaniye sayısıdır (şimdi UTC'de de). Bu nedenle, bir tarih nesnesi oluşturduğunuzda, sahne arkasında gerçekten UTC'dir. 2. Bu tarihi görüntülemek için, yerel ayar (toLocaleString () veya UTC'de (toUTCString ()) olarak görüntüleyebilirsiniz. Hiçbir şeyi kendiniz dönüştürmenize gerek yoktur. string - yerel saat diliminde olduğu sürece
da Bich

2
1234567890000, Y45K sorunu olarak bilinen 1234567890 ile aynı şekilde ele alınır ...
muttonUp

1
@muttonUp, 1000 çoklu uygulama ile çalıştı. Ancak, 'Y39K sorunu' google geçerli bir sonuç vermiyor. Herhangi bir URL yardımcı olacaktır
P Satish Patro

238

Kolay, new Date()sadece milisaniye sürer, örn.

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
Güzel bir! Bu gerçekten kabul edilen cevap olarak düşünülmelidir.
Nizar B.

Bu benim için işe yaramadı, zaman damgası olduğunda işe yarar ama utc dönemi ile utcseconds'ı manuel olarak ayarlamanız gerekir, kabul cevabı doğru cevaptır
sameerali

12
Bu uygun bir cevap. Yeni tarih 1000 ile bu nedenle sadece çarpın milisaniye alabilir: const d = new Date(epoch * 1000).
vinyll

@sameerali Belki de sisteminizle ilgili farklı bir sorununuz oldu ya da kafanız karıştı. Bu cevap doğru cevaptır. Unix döneminin tanımı: 1 Ocak gece yarısı UTC'den bu yana geçen saniye sayısı . Geçen milisaniye sayısını elde etmek için 1000 ile çarpmanız yeterlidir.
nalply

32

Ve sadece günlükler için, yine de biçimlendirme için kullandığım Moment.js kütüphanesini kullanarak yaptım .

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
An güzel, ama sadece bir dönemi bir tarihe dönüştürmek için 1.3MB kütüphane kullanmak delilik. Orada çok şişirilmiş düğüm uygulamaları var şaşılacak bir şey yok.
not2qubit

20

Epoch zaman olduğu saniye 1970. 1 Ocak gelen date.getTime()döner milisaniye bir dönem zaman damgası varsa, 1000 ile çarpılarak bir javascript zaman damgası dönüştürmek .. bu yüzden, 1 Ocak 1970 den.

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

Yeryüzünde ne olduğunu merak ediyordum. Tarih ayrıştırma söz konusu olduğunda epochTime! == javascriptTime olduğunu bilmek çok güzel . Teşekkürler!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
Günümü gün ettin. TY. Eksi işaretini işim için artı işaretiyle değiştirdim.
Ludovic Kuty

5

[Ms] cinsinden geçerli dönem zamanını 24 saatlik süreye dönüştürmek için. 12 saatlik biçimi devre dışı bırakma seçeneğini belirtmeniz gerekebilir .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

veya JS olarak:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

Not:en-GB Burada kullanımı , 24 saatlik biçimi kullanan bir yerin sadece (rastgele) bir seçimidir, saat diliminiz değildir!


1
Bu, Date yönteminden herhangi bir dönüşüm türünü almanın en iyi yoludur. Teşekkürler!
SeaWarrior404

Yukarıdakilerden hoşlanmadığım tek şey, tarihi o belirsiz bir formatta döndürmesi mi d/m/yyyyyoksa öyle m/d/yyyymi? Bu görüntülemek için (çoğu mantıksal) yolu doğru olmalıdır: yyyy-mm-dd. Arayan var mı?
not2qubit

4

Epoch zamanı (yani Unix Epoch zamanı) neredeyse her zaman buradaki bazı cevapların ima ettiği milisaniye sayısı değil, 1 Ocak 1970 00:00:00 (UTC saati) tarihinden bu yana geçen saniye sayısıdır .

https://en.wikipedia.org/wiki/Unix_time

Bu nedenle, size bir Unix Epoch zaman değeri verildiyse, muhtemelen saniyeler içinde olacak ve benzer bir şey olacaktır 1547035195. Bu insanı JavaScript'te okunabilir hale getirmek istiyorsanız, değeri milisaniyeye dönüştürmeniz ve bu değeri yapıcıya geçirmeniz gerekir Date(value), örneğin:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

d.setUTCMilliseconds(0)JavaScript Date(value)yapıcısı milisaniye cinsinden bir UTC değeri aldığından (yerel bir saat değil) kabul edilen yanıttaki adımı uygulamanız gerekmez .

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

Ayrıca Date(...), bir dize datetime temsili alan yapıcıyı kullanmaktan kaçınmanız gerektiğini unutmayın , bu önerilmez (yukarıdaki bağlantıya bakın).


3

Sadece bir UTC dizesini "yerel" dizeye dönüştürmek mi istiyorsunuz? Şunları yapabilirsiniz:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

@Djechlin tarafından yukarıdaki yanıta ekleme

d = '1394104654000';
new Date(parseInt(d));

EPOCH zamanını insan tarafından okunabilir tarihe dönüştürür. Sadece EPOCH zamanının bir Tamsayı olması gerektiğini unutmayın.


3

Bunu bulduğum en basit çözüm:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

Bunun (her ne olursa olsun benim için!) Her zaman yanlış tarih verdiğinden * 1000, new Date(timestamp)ifadenin sonunda bunun olmadığına dikkat edin , yani 2019 yılına vermek yerine yılı 51015 olarak verir, bu yüzden bunu aklınızda bulundurun.


2

Moment.js gibi kitaplıklar olmadan UTC ve yerel saat ve yerel saat dönüşlerini ve tarih dönüşümlerini çözümlemeyi tercih ediyorsanız aşağıdaki seçeneğe göz atın.

UTC zaman damgalarını kullanan uygulamalar için, yerel saat dilimi ve uygulanabilir olduğunda gün ışığından yararlanma seçeneklerini dikkate alarak tarayıcıda tarihi göstermeniz gerekebilir. Aynı saat diliminde bile farklı bir gün ışığından yararlanma saati içinde olan bir tarihi düzenlemek zor olabilir.

NumberveDate uzantıları, zaman damgalarının saat diliminde tarihleri ​​göstermenize ve almanıza olanak tanır. Örneğin, Vancouver'da olduğunuzu varsayalım, Temmuz veya Aralık ayında bir tarih düzenliyorsanız, bu, PST veya PDT'de bir tarih düzenlediğiniz anlamına gelebilir.

Bu çözümü test etmek için aşağıdaki Kod Parçacığı'nı kontrol etmenizi öneririz.

Milisaniye cinsinden dönüşümler

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

Tarihlerden dönüşümler

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

kullanım

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

Kendiniz görün


Asıl cevap bu. Benim için bir cazibe gibi çalıştı. Yeni Tarih (0) ayarlamak ve milliSeconds eklemek yeni Tarih (milliSeconds) ile aynıdır
Jersey_Guy

1

DÜZENLE

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDIT düzeltildi


Bunu ikinci örneğimde yaşadım. Bana verdiği farklılıklar, milisaniye cinsinden 50 ve 900 arasındadır (hesaplamanın işlenmesi sırasındaki zamanı, gerçek farkı değil)
Shane Reustle

Hiçbiri bana yardım etmiyor. Mükemmel bir setUTCTime yöntemini kaçırıyorlar: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle

En azından Ubuntu için Firefox'ta çalışmıyor. Kod, tarihi ayarladıktan sonra gün / ay / yıl ayarlamamalıdır.
Simon Kozlov

@Simon Kozlov Aslında tarih nesnesinde yanlış bir varsayım, setDate ve getDate aydaki güne atıfta bulunuyor ve sorun şu ki (setUTCDay) gibi işlevleri kullanmamam, kabul edilmesine şaşırdım !!
Amjad Masad

@AmjadMasad Beklenen çıktıyı da gösterirseniz yanıtınız daha yararlı olacaktır.
not2qubit

0

Düşündüğünüz zaman epoch_time,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@Amjad, iyi fikir, ancak daha iyi bir uygulama:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

Önce String'e dönüştürün ve sonra saat dilimi metnini değiştirin.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
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.