Bagaimana Anda mengonversi tanggal JavaScript ke UTC?

590

Misalkan pengguna situs web Anda memasuki rentang tanggal.

2009-1-1 to 2009-1-3

Anda perlu mengirim tanggal ini ke server untuk diproses, tetapi server mengharapkan semua tanggal dan waktu berada di UTC.

Sekarang anggaplah pengguna berada di Alaska atau Hawaii atau Fiji. Karena mereka berada di zona waktu yang sangat berbeda dari UTC, rentang tanggal perlu dikonversi menjadi sesuatu seperti ini:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Menggunakan objek Tanggal JavaScript, bagaimana Anda mengonversi rentang tanggal "terlokalisasi" pertama menjadi sesuatu yang akan dipahami server?

dthrasher
sumber
10
menghidupkan kembali ini karena itu adalah hit Google teratas untuk saya, dan browser yang lebih baru memiliki dukungan bawaan untuk string tanggal UTC.
jcomeau_ictx
4
Saya memperbarui jawaban yang diterima untuk menyoroti metode ECMAscript 5 toISOString () baru. Lihat stackoverflow.com/a/11957822/19112
dthrasher
5
jadi pada 2015 saya harus mengacaukan tanggal penguraian dan penguraian? konyol!
Toolkit
2
Tentu saja kamu punya. Anda tidak pernah bisa mengandalkan orang lain yang melakukan pekerjaan untuk Anda :-P Setidaknya sampai dunia berhenti menggunakan zona waktu dan mulai menyatukan tanggal dan waktu.
Erenor Paz
4
"Stardate", lebih disukai.
Michael Daw

Jawaban:

370

The toISOString()method mengembalikan string di disederhanakan diperpanjang format ISO ( ISO 8601 ), yang selalu 24 atau 27 karakter ( YYYY-MM-DDTHH:mm:ss.sssZatau ±YYYYYY-MM-DDTHH:mm:ss.sssZ, masing-masing). Zona waktu selalu nol diimbangi UTC, seperti yang ditunjukkan oleh akhiran " Z".

Sumber: dokumen web MDN

Format yang Anda butuhkan dibuat dengan .toISOString()metode ini. Untuk browser lama (ie8 dan di bawah), yang tidak mendukung metode ini, shim dapat ditemukan di sini :

Ini akan memberi Anda kemampuan untuk melakukan apa yang Anda butuhkan:

var isoDate = new Date('yourdatehere').toISOString();

Untuk kerja Timezone, time.js dan moment.js timezone adalah alat yang sangat berharga ... terutama untuk menavigasi zona waktu antara klien dan javascript server.

Will Stern
sumber
81
sebenarnya ini mengonversi objek tanggal ke string, tidak akan dapat melakukan operasi tanggal lebih lanjut di atasnya
orszaczky
2
@TheRebel, use-case yang diberikan adalah bahwa ia perlu mengirim server string yang diformat.
Will Stern
28
@ Akan, Anda sepenuhnya benar, tetapi - sama seperti sebagian besar pemirsa di sini saya berasumsi - Saya tiba di sini berdasarkan judul, mencari tanggal JS umum untuk konversi UTC, jadi saya pikir akan berguna untuk menyebutkannya di sini :)
orszaczky
4
Berhati-hatilah saat menggunakan metode ini! Itu tidak membuat tanggal UTC - itu memformat data tanggal yang ada apa adanya ke dalam format UTC dan memberinya zona waktu "Z". Ini salah 99% dari waktu! Anda harus mengonversi tanggal menjadi zona waktu GMT sebelum menggunakan metode ini!
user1944491
5
@ user1944491 Saya rasa ini tidak benar. Menurut dokumen MDN, toISOStringapakah benar dikonversi ke UTC [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetJuga dalam contoh mereka menunjukkan offset diperhitungkan ketika toISOString disebut
FFF
560

Sederhana dan bodoh

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);
DrunkCoder
sumber
85
Saya menyukai ide Anda dan melakukan metode yang telah saya gunakan berkali-kali. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim
21
Kode terpendek yang saya buat untuk mendapatkan tanggal dan waktu UTC adalah dengan memotong zona waktu:new Date(new Date().toUTCString().substr(0, 25))
joelvh
17
Perhatikan bahwa getUTCMonth () mengembalikan nilai 0 hingga 11. Jadi, jika Anda membutuhkan bulan dengan angka alih-alih sebuah string, ini membantu memberi +1 ke nilai tersebut.
Talvi Watia
19
Ini tidak masuk akal. Tanggal baru akan memiliki nilai yang berbeda dari yang Anda inginkan. Gunakan saja now.toUTCSTring()alih-alih (salah) now_utc.toString().
Bergi
22
Saya tidak akan menggunakan ini - dengan menggunakan Date baru () Anda mendapatkan zona waktu browser. di Chrome 29 dan IE10, tanggal + waktu tampaknya benar, tetapi zona waktu diatur ke zona waktu peramban, yang dapat menyebabkan masalah ...
Sean
207

Inilah metode saya:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

utcObjek yang dihasilkan sebenarnya bukan tanggal UTC, tetapi tanggal lokal bergeser untuk mencocokkan waktu UTC (lihat komentar). Namun, dalam praktiknya ia berhasil.

Gras Double
sumber
Saya melihat masalah itu ketika saya menyadari bahwa Date.now()memberi waktu lokal dan bukan waktu UTC, dan solusi ini tampaknya yang paling sederhana bagi saya. Setidaknya dalam kasus saya di mana saya ingin waktu UNIX dan bukan string yang diformat dengan baik. (satu-satunya perbedaan adalah bahwa saya akan berlipat ganda 60 * 1000hanya untuk menjadi lebih jelas :))
Timothée Boucher
18
Menambahkan 60000 * Date.getTimezoneOffset () salah! Pertama, Anda harus menganggap semua Tanggal / Waktu sebagai UTC dengan pengubah zona waktu untuk tujuan tampilan. Peramban mungkin berbeda, namun Date.getTime () mengembalikan jumlah milidetik sejak 1970-01-01. Jika Anda membuat Tanggal baru menggunakan nomor ini, mis: Tanggal baru (Date.getTime ()); itu akan menjadi UTC , namun ketika Anda menampilkannya (mis: melalui konsol alat dev chrome) itu akan tampak sebagai zona waktu lokal Anda.
Aaron Hoffman
15
Di browser saya, ini menciptakan DateTime yang bukan UTC. Namun ketika ditampilkan dalam browser saya, ini menampilkan DateTime di zona waktu lokal saya yang akan menjadi waktu UTC yang benar jika info zona waktu diabaikan.
Aaron Hoffman
Gotcha, poin menarik. Mari kita bandingkan now.toString()dengan utc.toString(): tidak ada perubahan zona waktu, tetapi perubahan waktu, yang merupakan hal yang sangat berbeda. Namun, solusi yang lebih bersih akan menjadi jauh lebih rumit (saya kira begitu), dan kode ini berfungsi dengan baik di sebagian besar kasus, selama seseorang tidak berurusan lebih jauh dengan zona waktu. Itu membuat saya mengingatkan tentang bebek meninju : hal yang berbeda tetapi dibuat untuk berperilaku sama. Perhatikan juga kode DrunkCoder memiliki masalah yang sama.
Gras Double
4
Jawaban ini menunjukkan implementasi umum lain dari "pergeseran zaman" yang berbahaya dalam isolasi, karena dapat gagal dekat kasus tepi seperti transisi DST. Tidak direkomendasikan.
Matt Johnson-Pint
25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}
kennebec
sumber
Ini bekerja dengan baik. Saya hanya perlu mengganti "-" pada tanggal sumber saya ke "/" untuk membuat tanggal JavaScript, maka saya bisa memanggil fungsi toISO () Anda untuk mendapatkan hasil yang benar.
dthrasher
ini bekerja dengan baik. Anda juga dapat memasukkan hasilnya ke jQuery $ .parseDate (...) untuk mendapatkan objek tanggal kembali yang telah bergeser ke UTC.
Brian Ellis
23

Konversikan ke ISO tanpa mengubah tanggal / waktu

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Konversikan ke ISO dengan perubahan tanggal / waktu (tanggal / waktu akan berubah)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Tautan biola

RollerCosta
sumber
jadi ini semacam tipuan UTC? Saya menggeser tanggal lokal saya dan saya berhasil mengirimkan ke server tanggal dan waktu yang sebenarnya saya lihat di jam PC saya. Wow. Pokoknya lebih baik daripada melakukan strinifying dan parsing
Toolkit
Anda juga tidak perlu .toISOString (), Anda cukup mengirim isoDate ke server
Toolkit
.toISOString () sederhana dan lurus, mendapatkan tanggal darinya akan menjadi langkah ekstra (isoDate bukan fungsi).
RollerCosta
Tidakkah Anda perlu menambahkan offset alih-alih mengurangkannya? Lihat stackoverflow.com/a/11964609/832230
Acumenus
@ABB Jika offset zona waktu saat ini + ve maka kita harus mengurangi itu (dalam kasus kami IST adalah +5: 30) jika tidak tambahkan.
RollerCosta
18

Browser mungkin berbeda, dan Anda juga harus ingat untuk tidak mempercayai info apa pun yang dihasilkan oleh klien, karena dikatakan, pernyataan di bawah ini berfungsi untuk saya (Google Chrome v24 pada Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


sunting: "Apa bedanya dengan adil new Date()?" lihat di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • Jika tidak ada argumen yang diberikan, konstruktor membuat objek Tanggal JavaScript untuk tanggal dan waktu saat ini sesuai dengan pengaturan sistem.
  • Catatan: Di mana Date disebut sebagai konstruktor dengan lebih dari satu argumen, argumen tertentu mewakili waktu lokal. Jika UTC diinginkan, gunakan Date baru ( Date.UTC (...) ) dengan argumen yang sama. (catatan: Date.UTC () mengembalikan jumlah milidetik sejak 1970-01-01 00:00:00 UTC)

Menambahkan 60000 * Date.getTimezoneOffset () seperti jawaban sebelumnya nyatakan tidak benar. Pertama, Anda harus menganggap semua Tanggal / Waktu sebagai UTC dengan pengubah zona waktu untuk tujuan tampilan.

Sekali lagi, browser mungkin berbeda, namun Date.getTime () mengembalikan jumlah milidetik sejak 1970-01-01 UTC / GMT. Jika Anda membuat Tanggal baru menggunakan nomor ini seperti yang saya lakukan di atas, itu akan menjadi UTC / GMT. Namun, jika Anda menampilkannya dengan memanggil .toString () itu akan muncul di zona waktu lokal Anda karena .toString () menggunakan zona waktu lokal Anda, bukan zona waktu objek Tanggal itu dipanggil.

Saya juga menemukan bahwa jika Anda memanggil .getTimezoneOffset () pada tanggal, itu akan mengembalikan zona waktu lokal Anda, bukan zona waktu objek tanggal yang Anda panggil (namun saya tidak dapat memverifikasi ini sebagai standar).

Di browser saya, menambahkan 60000 * Date.getTimezoneOffset () membuat DateTime yang bukan UTC . Namun ketika ditampilkan dalam browser saya (mis: .toString ()), ini menampilkan DateTime di zona waktu lokal saya yang akan menjadi waktu UTC yang benar jika info zona waktu diabaikan.

Aaron Hoffman
sumber
11
Saya baru saja menjalankan kode ini di Fx dan Chrome, sepertinya tidak berfungsi: hasilnya persis sama dengan dari new Date(), baik timestamp maupun zona waktu tidak berubah
Gras Double
3
Itu karena cap waktu kurang zona waktu. new Date().getTime()akan selalu mengembalikan stempel waktu yang agnostik ke zona waktu. Tidak ada stempel waktu yang dikaitkan dengannya hingga Anda mencoba memformatnya menjadi selain milidetik sejak zaman Unix.
frontendbeauty
7
Sejauh yang saya tahu new Date(new Date().getTime())pengembalian nilai persis sama dengan new Date(). Bisakah Anda menjelaskan dalam arti apa jawaban Anda memberikan nilai berbeda new Date()?
Kirk Woll
Saya memposting nilai ini ke server saya new Date("5/19/2014").getTime(). Konstruktor Tanggal membuat tanggal dengan offset +7. Di server (C #), saya menambahkan nilai yang diposting sebagai milidetik untuk unix zaman new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). Hasilnya adalah 5/19/2014 7:00:00 AM. Jadi sepertinya getTime () memberikan jumlah milidetik termasuk offset UTC saya.
xr280xr
1
Ada banyak komentar yang mengeluh new Date(new Date().getTime())tidak berhasil. Saya dapat mengkonfirmasi bahwa new Date(Date.UTC(2019, 8, 27, 0, 0, 0))memang menghasilkan waktu UTC. Jika Anda gagal menggunakan Date.UTC(...)Anda akan mendapatkan tanggal dalam offset UTC di zona waktu Anda.
Alex Barker
15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
James Skidmore
sumber
1
Objek tanggal harus benar-benar diatur ke tanggal. Di atas hanyalah sebuah contoh.
James Skidmore
5
Sekarang mengembalikan "Kamis, 04 Jun 2009 04:10:56 GMT", yang bukan format ISO yang diperlukan dalam OP.
nickf
4
Ini mengubahnya menjadi string, yang bukan kencan
Anthony
2
tidak, sebenarnya itu harus berupa representasi string dari tanggal menurut OP.
jcomeau_ictx
3
Setelah mengonversi ke UTC, ia kembali dalam format string, lalu cara mengakses metode seperti getMonth (), getDate () dll.
Sandeep sandy
10

Solusi lain untuk mengonversi ke UTC dan menjadikannya sebagai objek tanggal: (Ini berfungsi dengan menghapus bagian 'GMT' dari akhir string yang diformat, lalu memasukkannya kembali ke konstruktor Tanggal)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

Saya perlu melakukan ini untuk berinteraksi dengan perpustakaan pemilih datetime. Tetapi secara umum itu ide yang buruk untuk bekerja dengan kencan dengan cara ini.

Pengguna umumnya ingin bekerja dengan waktu data dalam waktu lokal mereka, jadi Anda memperbarui kode sisi server untuk mengurai string datetime dengan offset dengan benar, lalu mengonversi ke UTC (opsi terbaik) atau Anda mengonversi ke sisi klien string UTC sebelum mengirim ke server (seperti dalam jawaban Will Stern)

CMcClymont
sumber
7

Apakah Anda mencoba mengubah tanggal menjadi string seperti itu?

Saya akan membuat fungsi untuk melakukan itu, dan, meskipun sedikit kontroversial, tambahkan ke prototipe Date. Jika Anda tidak nyaman melakukan itu, maka Anda dapat menempatkannya sebagai fungsi mandiri, melewati tanggal sebagai parameter.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Jika Anda membutuhkannya dalam waktu UTC, ganti saja semua fungsi get * dengan getUTC *, mis: getUTCFullYear, getUTCMonth, getUTCHours ... lalu tambahkan "+00: 00" di akhir alih-alih offset zona waktu pengguna.

nickf
sumber
1
Ini adalah contoh pertama yang saya lihat yang mencoba menangani zona waktu offset, jadi +1 untuk itu. Namun, saya menemukan beberapa hal dengan itu - temp.substr (-2) menyebabkan kesalahan karena itu angka, bukan string, jadi Anda perlu melakukan sesuatu seperti "temp = '' + temp;" pertama, untuk mengubahnya menjadi string. Juga, saya lebih suka tanggal ISO saya nol-empuk - saya pikir ini membuat mereka lebih standar.
Mick Sear
@Mick - Saya sudah memperbarui untuk memperbaiki bug itu. Saya telah menggunakan String(temp)sejak cara lain ( "" + temp) dilaporkan sebagai kesalahan JSLint hari ini.
nickf
Ini sekarang distandarisasi sebagai toISOStringmetode
Bergi
7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

seharusnya bekerja di sebagian besar browser yang lebih baru. kembali 2012-07-28T00:00:00.000Zpada Firefox 6.0

jcomeau_ictx
sumber
7

Rekomendasi saya ketika bekerja dengan tanggal adalah mengurai tanggal ke dalam masing-masing bidang dari input pengguna. Anda dapat menggunakannya sebagai string penuh, tetapi Anda bermain dengan api.

JavaScript dapat memperlakukan dua tanggal yang sama dalam format yang berbeda secara berbeda.

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

Jangan pernah melakukan hal seperti:

new Date('date as text');

Setelah tanggal Anda diuraikan ke dalam masing-masing bidang dari input pengguna, buat objek tanggal. Setelah objek tanggal dibuat, konversikan ke UTC dengan menambahkan offset zona waktu. Saya tidak bisa menekankan betapa pentingnya menggunakan offset dari objek tanggal karena DST (itu adalah diskusi lain namun untuk menunjukkan alasannya).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

Sekarang Anda dapat mengirimkan tanggal ke server dalam waktu UTC. Sekali lagi saya akan sangat menyarankan agar tidak menggunakan string tanggal. Entah meneruskannya ke server dipecah menjadi granularity terendah yang Anda butuhkan misalnya tahun, bulan, hari, menit atau sebagai nilai seperti milidetik dari zaman unix.

Timothy Gonzalez
sumber
FYI getYear dihapus dari standar web developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ghan
6

Jika Anda sering berurusan dengan kencan, ada baiknya menggunakan moment.js ( http://momentjs.com ). Metode untuk mengkonversi ke UTC adalah:

moment(yourTime).utc()

Anda dapat menggunakan format untuk mengubah tanggal Anda ke format apa pun yang Anda inginkan:

moment(yourTime).utc().format("YYYY-MM-DD")

Ada opsi offset pada saat itu juga tetapi ada perpustakaan pelengkap tambahan untuk berurusan dengan zona waktu ( http://momentjs.com/timezone/ ). Konversi waktu akan sesederhana ini:

moment.tz(yourUTCTime, "America/New_York")
Adam Boostani
sumber
apa perbedaan antara moment(yourTime).utc()dan moment.utc(yourTime)? Saya biasanya menggunakan yang terakhir.
ps0604
5

Solusi saya menjaga tanggal tetap sama, apa pun zona waktu yang ditetapkan di sisi klien. Mungkin seseorang akan merasakan manfaatnya.

Kasus penggunaan saya:

Saya membuat aplikasi todo, tempat Anda mengatur tanggal tugas Anda. Tanggal ini harus tetap konstan, tidak peduli apa zona waktu Anda.

Contoh. Anda ingin menelepon teman Anda pada jam 8 pagi pada tanggal 25 Juni.

Anda membuat tugas ini 5 hari sebelum (20 Juni) saat Anda berada di Cina.

Kemudian, pada hari yang sama, Anda terbang ke New York selama beberapa hari.

Kemudian pada tanggal 25 Juni, ketika Anda masih di New York, Anda bangun jam 7:30 pagi (yang berarti Anda harus menerima notifikasi tugas dalam 30 menit (bahkan jam 1:30 siang sudah di China di mana Anda berada saat membuat tugas)

Jadi tugasnya mengabaikan zona waktu. Itu berarti 'Saya ingin melakukannya pada jam 8 pagi di zona waktu apa pun yang akan saya tempati'.

Yang saya lakukan adalah katakanlah 'Saya berasumsi Anda selalu berada di London Timezone - UTC'.

Artinya adalah - ketika pengguna memilih tanggal di Zona Waktu - saya mengonversi tanggal ini ke tanggal yang sama di UTC. yaitu. Anda memilih 8 pagi di Cina, tetapi saya mengubahnya menjadi 8 pagi dalam UTC.

Kemudian - lain kali Anda membuka aplikasi - Saya membaca tanggal yang disimpan dalam UTC dan mengubahnya ke tanggal yang sama di zona waktu Anda saat ini - mis. Saya mengonversi 8 pagi dalam UTC ke 8 pagi di zona waktu New York.

Solusi ini berarti bahwa tanggal tersebut dapat berarti sesuatu yang lain bergantung pada di mana Anda berada saat mengaturnya dan di mana Anda membacanya, tetapi itu tetap konstan dengan cara yang 'terasa' seperti Anda selalu berada di zona waktu yang sama.

Mari kita menulis beberapa kode:

Pertama - kami memiliki 2 fungsi utama untuk mengkonversi dari / ke UTC mengabaikan zona waktu:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Kemudian, saya menyimpan / membaca tanggal ini seperti:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}
pie6k
sumber
4

Saya baru saja menemukan bahwa versi 1.2.3 dari date.format.js Steven Levithan melakukan apa yang saya inginkan. Ini memungkinkan Anda untuk menyediakan string format untuk tanggal JavaScript dan akan dikonversi dari waktu setempat ke UTC. Berikut kode yang saya gunakan sekarang:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 
dthrasher
sumber
9
Ini sepertinya bukan jawaban terbaik untuk pertanyaan Anda. Anda harus mempertimbangkan kembali sesuatu yang secara langsung menjawab pertanyaan Anda atau mengajukan pertanyaan Anda secara berbeda.
hitautodestruct
1
Saya kebetulan MEMPERBAIKI skrip yang tepat ini (dan versi) karena tidak cukup untuk IE7 dan Firefox.
Barbarrosa
4

Saya telah menemukan tanggal Plugin jQuery Globalization Plugin bekerja dengan baik. Metode lain memiliki masalah lintas-browser dan hal-hal seperti date.js belum diperbarui dalam waktu yang cukup lama.

Anda juga tidak memerlukan datePicker di halaman tersebut. Anda bisa memanggil sesuatu yang mirip dengan contoh yang diberikan dalam dokumen:

$.parseDate('yy-mm-dd', '2007-01-26');
Brian Ellis
sumber
1
Hanya karena sesuatu belum diperbarui, bukan berarti Anda tidak boleh menggunakannya. Date.js telah bekerja sangat sempurna selama bertahun-tahun, jadi tidak perlu diperbarui. Objek Tanggal JS dan format tanggal yang digunakan belum berubah dalam beberapa tahun terakhir, jadi mengapa skrip yang memanipulasi mereka? Date.JS benar-benar perpustakaan JS Date terbaik di luar sana. Ada beberapa masalah untuk itu di github, tetapi jika tidak, itu sempurna. github.com/datejs/Datejs
thugsb
3

Fungsi ini bekerja dengan baik untuk saya.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}
Will Strohl
sumber
3

Menggunakan metode UTC moment.js ;

const moment = require('moment');
const utc = moment.utc(new Date(string));
Yaki Klein
sumber
2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Ini akan memberi Anda Tanggal dan Waktu UTC yang tepat.
Itu karena getTimezoneOffset()akan memberi Anda perbedaan zona waktu dalam beberapa menit. Saya sarankan Anda untuk tidak menggunakan toISOString()karena output akan berada di string Karena itu di masa depan Anda tidak akan dapat memanipulasi tanggal

Sanket Patel
sumber
2

Inilah yang telah saya lakukan di masa lalu:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
Pradyumna Das
sumber
2

Jika Anda membutuhkan Objek Tanggal

Hanya melewati string tanggal Tanggal mengasumsikan waktu 00:00 digeser berdasarkan zona waktu:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Jika Anda menambahkan jam dan menit saat ini Anda mendapatkan tanggal yang tepat:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)
keemor
sumber
1

Melihat pertanyaan Anda, jelas bahwa Anda hanya ingin mengirim rentang tanggal ke backend Anda untuk diproses lebih lanjut.

Saya berasumsi bahwa Anda mematuhi pedoman data standar yang mengharapkan data dalam format tertentu. Misalnya, saya menggunakan ODATA yang merupakan RESTfull API yang mengharapkan objek waktu tanggal dalam format: -

YYYY-MM-DDT00: 00: 00.

Itu dapat dengan mudah dicapai melalui cuplikan yang diposting di bawah ini (Silakan ubah format sesuai kebutuhan Anda).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Jika di sisi lain, Anda berada dalam situasi saya di mana Anda telah menerima tanggal dari backend Anda, dan browser mengubahnya menjadi tanggal lokal Anda. Anda sebaliknya tertarik pada tanggal UTC maka Anda dapat melakukan hal-hal berikut: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

Cuplikan kode di atas pada dasarnya menambah / mengurangi waktu yang ditambahkan / dikurangi oleh browser berdasarkan zona waktu.

Sebagai contoh jika saya dalam EST (GMT-5) dan Layanan saya mengembalikan objek waktu tanggal = Rabu 17 Agustus 2016 00:00:00 GMT-0500 browser saya secara otomatis mengurangi offset zona waktu (5 jam) untuk mendapatkan waktu lokal saya. Jadi jika saya mencoba untuk mengambil waktu saya dapatkan Rabu 16 Agustus 2016 19:00:00 GMT-0500. Ini menyebabkan banyak masalah. Ada banyak perpustakaan di luar sana yang pasti akan membuat ini lebih mudah tetapi saya ingin berbagi pendekatan JS murni.

Untuk info lebih lanjut silakan lihat di: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ di mana saya dapat inspirasi.

Semoga ini membantu!

Reeth
sumber
1

Metode ini akan memberi Anda: 2017-08-04T11:15:00.000+04:30dan Anda dapat mengabaikan variabel zona untuk mendapatkan 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}
AmirHossein Manian
sumber
1

Menggunakan paket momen, Anda dapat dengan mudah mengkonversi string tanggal UTC ke objek Tanggal baru:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Ini secara khusus membantu ketika server Anda tidak mendukung zona waktu dan Anda ingin menyimpan tanggal UTC selalu di server dan mendapatkannya kembali sebagai objek Date yang baru. Kode di atas berfungsi untuk kebutuhan saya terhadap masalah yang serupa dengan utas ini. Berbagi di sini sehingga dapat membantu orang lain. Saya tidak melihat solusi tepat di atas dalam jawaban apa pun. Terima kasih.

Bimal Jha
sumber
4
Meskipun ini dapat menjawab pertanyaan, tidak ada penjelasan tentang kode Anda. Harap perbarui jawaban Anda untuk memberikan penjelasan tentang apa yang Anda lakukan. Terima kasih!
Miroslav Glamuzina
1

const event = Tanggal baru ();

console.log (event.toUTCString ());

Sumit Khanduri
sumber
0

Saya tahu pertanyaan ini sudah lama, tetapi sedang melihat masalah yang sama, dan salah satu opsi adalah mengirim date.valueOf () ke server sebagai gantinya. fungsi valueOf () dari Tanggal javascript mengirimkan jumlah milidetik sejak tengah malam 1 Januari 1970 UTC.

Nilai dari()

weagle08
sumber
0

Jadi ini adalah cara saya harus melakukannya karena saya masih ingin objek tanggal JavaScript untuk memanipulasi sebagai tanggal dan sayangnya banyak dari jawaban ini mengharuskan Anda untuk pergi ke string.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 
kjohnsonthecoder
sumber
0

benang tambahkan momen

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}

Israt Jahan Simu
sumber
-8

Lebih sederhana

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
some one
sumber
2
Ini tidak lengkap. setTimemengandalkan new Date, yang tidak termasuk. Mohon selesaikan jawabannya.
random_user_name
apakah pria ini masih hidup? mengapa bahkan tidak kembali kepada kami, menceritakan sesuatu atau mengedit jawabannya?
Putus asa