Saya telah berjuang dengan ini untuk sedikit sekarang. Aku mencoba untuk mengkonversi zaman ke objek tanggal. Zaman yang dikirim ke saya di UTC. Setiap kali anda melewati new Date()
zaman, ia menganggap itu lokal zaman. Saya mencoba membuat UTC objek, maka menggunakan setTime()
untuk menyesuaikan dengan tepat zaman, tapi satu-satunya metode yang tampaknya berguna adalah toUTCString()
dan string tidak membantu saya. Jika saya lulus string menjadi tanggal baru, itu harus melihat bahwa itu UTC, tapi itu tidak.
new Date( new Date().toUTCString() ).toLocaleString()
Berikutnya adalah upaya untuk mencoba untuk mendapatkan perbedaan antara lokal saat ini zaman dan UTC zaman saat ini, tapi aku tidak bisa mendapatkan yang baik.
new Date( new Date().toUTCString() ).getTime() - new Date().getTime()
Itu hanya membuatku sangat kecil perbedaan, bawah 1000, yang dalam milidetik.
Ada saran?
Saya pikir saya memiliki solusi sederhana -- menetapkan tanggal awal untuk zaman dan tambahkan UTC unit. Katakanlah anda memiliki UTC zaman var tersimpan dalam hitungan detik. Bagaimana tentang 1234567890
. Untuk mengkonversi ke yang tepat saat ini di zona waktu lokal:
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
sekarang tanggal (dalam zona waktu) diatur ke Fri Feb 13 2009 18:31:30 GMT-0500 (EST)
Zaman waktu ini di detik dari Jan. 1, 1970. date.getTime()
kembali milidetik dari Jan. 1, 1970, jadi.. jika anda memiliki sebuah zaman timestamp, mengkonversi ke javascript timestamp dengan mengalikan dengan 1000.
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;
}
Untuk mengkonversi arus zaman waktu di [ms] untuk waktu 24 jam. Anda mungkin perlu untuk menentukan pilihan ke disable 12-hour format.
$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"
2/7/2018, 19:35:24
atau seperti JS:
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
Catatan: penggunaan en-GB
di sini, hanya (random) pilihan tempat dengan menggunakan format 24 jam, itu bukan zona waktu anda!
Kau hanya meminta untuk mengkonversi UTC string ke "lokal" string? Anda bisa melakukan:
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);
Solusi yang paling sederhana I've ditemukan untuk ini, adalah:
var timestamp = Date.now(), // returns milliseconds since epoch time
normalisedTime = new Date(timestamp);
Pemberitahuan ini doesn't memiliki * 1000
di akhir new Date(timestamp)
pernyataan seperti ini (bagi saya lho!) tampaknya selalu memberikan tanggal yang salah, yaitu bukannya memberikan tahun 2019 memberikan tahun sebagai 51015, jadi beruang itu dalam pikiran.
Jika anda lebih memilih untuk menyelesaikan cap waktu dan tanggal konversi dari dan untuk waktu UTC dan waktu lokal tanpa perpustakaan seperti moment.js, lihatlah pilihan di bawah ini.
Untuk aplikasi yang menggunakan UTC waktu, anda mungkin perlu untuk menunjukkan tanggal di browser mempertimbangkan zona waktu lokal dan daylight savings ketika berlaku. Mengedit tanggal yang berbeda daylight savings time meskipun di zona waktu yang sama dapat menjadi rumit.
Jumlah
dan Tanggal
ekstensi di bawah ini memungkinkan anda untuk menunjukkan dan mendapatkan tanggal di zona waktu dari waktu. Misalnya, katakanlah anda berada di Vancouver, jika anda mengedit sebuah tanggal di bulan juli atau agustus, itu bisa berarti anda sedang mengedit sebuah tanggal di PST atau PDT.
Saya sarankan anda untuk memeriksa Cuplikan Kode di bawah untuk menguji solusi ini.
Konversi dari milidetik
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;
};
Konversi dari tanggal
Date.prototype.getUTCTime = function () {
return this.getTime() - (this.getTimezoneOffset() * 60000);
};
Penggunaan ****
// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();
// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();
Lihat ini untuk diri sendiri
// Extending Number
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;
};
// Extending Date
Date.prototype.getUTCTime = function () {
return this.getTime() - (this.getTimezoneOffset() * 60000);
};
// Getting the demo to work
document.getElementById('m-to-local-button').addEventListener('click', function () {
var displayElement = document.getElementById('m-to-local-display'),
value = document.getElementById('m-to-local').value,
milliseconds = parseInt(value);
if (typeof milliseconds === 'number')
displayElement.innerText = (milliseconds).toLocalDate().toISOString();
else
displayElement.innerText = 'Set a value';
}, false);
document.getElementById('m-to-utc-button').addEventListener('click', function () {
var displayElement = document.getElementById('m-to-utc-display'),
value = document.getElementById('m-to-utc').value,
milliseconds = parseInt(value);
if (typeof milliseconds === 'number')
displayElement.innerText = (milliseconds).toUTCDate().toISOString();
else
displayElement.innerText = 'Set a value';
}, false);
document.getElementById('date-to-utc-button').addEventListener('click', function () {
var displayElement = document.getElementById('date-to-utc-display'),
yearValue = document.getElementById('date-to-utc-year').value || '1970',
monthValue = document.getElementById('date-to-utc-month').value || '0',
dayValue = document.getElementById('date-to-utc-day').value || '1',
hourValue = document.getElementById('date-to-utc-hour').value || '0',
minuteValue = document.getElementById('date-to-utc-minute').value || '0',
secondValue = document.getElementById('date-to-utc-second').value || '0',
year = parseInt(yearValue),
month = parseInt(monthValue),
day = parseInt(dayValue),
hour = parseInt(hourValue),
minute = parseInt(minuteValue),
second = parseInt(secondValue);
displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime();
}, false);
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>
<div class="ui container">
<p></p>
<h3>Milliseconds to local date</h3>
<input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
<em id="m-to-local-display">Set a value</em>
<h3>Milliseconds to UTC date</h3>
<input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
<em id="m-to-utc-display">Set a value</em>
<h3>Date to milliseconds in UTC</h3>
<input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
<input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
<input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
<input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
<input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
<input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
<button id="date-to-utc-button">Convert</button>
<em id="date-to-utc-display">Set the values</em>
</div>
Epoch time (yaitu Unix Epoch time) hampir selalu jumlah detik yang telah kadaluarsa sejak 1 Januari 1970 00:00:00 UTC (waktu), bukan jumlah milidetik yang beberapa jawaban di sini tersirat.
https://en.wikipedia.org/wiki/Unix_time
Oleh karena itu, jika anda telah diberikan Unix Epoch time value mungkin akan dalam hitungan detik, dan akan terlihat seperti 1547035195
. Jika anda ingin membuat ini yang dapat dibaca manusia dalam JavaScript, anda perlu mengkonversi nilai ke milidetik, dan lulus nilai yang menjadi Tanggal(nilai)
konstruktor, misalnya:
const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();
Anda don't perlu melakukan d.setUTCMilliseconds(0)
langkah dalam jawaban yang diterima karena JavaScript Tanggal(nilai)
konstruktor mengambil UTC nilai dalam milidetik (bukan waktu setempat).
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax
Perhatikan juga bahwa anda harus menghindari menggunakan Tanggal(...)
konstruktor yang mengambil string datetime representasi, hal ini tidak dianjurkan (lihat link di atas).
EDIT
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 tetap
@Amjad, ide yang bagus, tapi implementasinya buruk. Mencoba
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();
}
Mengingat, anda memiliki epoch_time
yang tersedia,
// 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