Angular.js: $http mengubah tanggal dalam objek JSON POSTED (menghapus zona waktu atau offset musiman)

Dibuat pada 25 Apr 2016  ·  3Komentar  ·  Sumber: angular/angular.js

Saya pikir ini adalah bug.

Apa perilaku saat ini?

Saat ini saya memiliki objek tanggal yang bagus yang keluar ke

Jum 29 Apr 2016 13:33:00 GMT+0100 (BST)

Ketika objek ini kemudian DIPOSTING melalui $http berikut ini diamati dalam permintaan jaringan..

28-04-2016T12:33:00.000Z

Jadi objek $http mengurangi satu jam dan secara efektif menghapus BST Waktu Musim Panas Inggris dari waktu. Jadi ini disimpan dalam database tanpa offset ini. Ketika kita segera membaca tanggal ini, tanggal itu kembali tetapi bagaimana sistem dapat mengetahui bahwa kita perlu menambahkan kembali jamnya?

Jadi bayangkan juga pengguna berada di zona waktu lain..katakanlah 5 jam ke depan maka sistem akan mengurangi 5 jam...Waktu peka terhadap konteks di mana ia dibuat. dengan kata lain informasi zona waktu tidak boleh dihapus.

Saya melihat ini di Chrome. Sudut 1.4.2

Juga http://stackoverflow.com/questions/24356475/angular-js-date-changes-when-submitting-to-http-timezone-issue

Komentar yang paling membantu

Pertama saya pikir itu tidak benar mengatakan objek Tanggal tidak memiliki informasi zona waktu.

Saya masih berpikir itu benar untuk mengatakan bahwa :grin: Objek Date _"mewakili satu momen dalam waktu [...] berdasarkan nilai waktu yaitu jumlah milidetik sejak 1 Januari 1970 UTC" _ (sumber: MDN ). Jadi, pada dasarnya setiap instance Date hanya tahu tentang nilai yang satu ini dan semua representasi lainnya diinduksi berdasarkan info itu ditambah status lokal/sistem (seperti offset zona waktu).

#

Objek Date memiliki metode getTimezoneOffset dan toISOString .

Ini adalah metode pada prototipe Date (sumber: MDN ), bukan dari objek Date (alias instance) itu sendiri.

Lebih khusus lagi, nilai getTimezoneOffset() bergantung pada lokal saat ini (pengaturan sistem host). Inilah alasan mengapa tidak ada metode setTimezoneOffset() setara dan mengapa semua objek Date pada sistem yang sama mengembalikan nilai yang sama untuk getTimezoneOffset() , misalnya:

const d1 = new Date('December 15, 2018 12:34:56');  // No timezone; uses the current system locale.
const d2 = new Date('December 15, 2018 12:34:56 GMT+10'); // Uses GTM+10 as timezone.

d1.getTimezoneOffset() === d2.getTimezoneOffset();  // true

Jadi, info zona waktu yang ditentukan dalam representasi string tanggal yang diteruskan ke Date hanya digunakan untuk mengurai string itu dan memetakannya ke waktu tertentu seperti yang dijelaskan di atas. Objek Date dihasilkan tidak tahu apa-apa tentang zona waktu :smiley:

Metode toISOString() tidak mencetak info zona waktu seperti yang Anda sarankan. Itu hanya menambahkan Z di akhir, yang menunjukkan UTC .

#

Kedua, JSON.stringify() juga tidak menghapus nilai zona

Seperti dijelaskan di atas, ia menggunakan toISOString() , yang menyatakan nilai tanggal dalam UTC (dengan demikian menambahkan Z di akhir untuk menunjukkan itu). Tidak ada info zona waktu dalam string yang dikembalikan.

#

Jadi saya masih percaya adalah bahwa jika API membuat tanggal ISO yang tidak memiliki nilai milidetik dan UI menggunakan beberapa datepicker yang hanya memilih tanggal dan mengubah tanggal maka Angular saat mengirim tanggal kembali dikonversi ke format ISO tidak akan memiliki milidetik nilai.

Saya tidak tahu apa hubungannya dengan milidetik. Kami berbicara tentang info zona waktu.

Sekali lagi, ini tidak ada hubungannya dengan AngularJS. Beginilah cara objek bawaan (seperti Date dan JSON ) berinteraksi satu sama lain.

Semua 3 komentar

Ini bukan sesuatu yang khusus untuk Angular. Ini adalah perilaku standar JSON.stringify .

Pada dasarnya, saat memposting data, $http mengonversinya menjadi JSON (melalui JSON.stringify() ). Dalam JavaScript, representasi JSON dari objek Date adalah bentuk ISO-8601-nya (yang Anda lihat di tab jaringan).

Objek Date tidak memiliki informasi zona waktu, jadi tidak ada informasi yang dilucuti. Lokal saat ini (yang benar-benar independen dari tanggal yang diwakili oleh objek Date) memiliki offset zona waktu dan browser memformat tanggal sesuai dengan offset tersebut saat console.log ging.

Menutup karena ini bukan masalah dengan Angular.

@gkalpak Pertama saya pikir itu tidak benar mengatakan objek Tanggal tidak memiliki informasi zona waktu. Saat kita membuat tanggal dengan Tanggal baru(), informasi zona waktu adalah zona lokal secara default. Objek Date memiliki metode getTimezoneOffset dan toISOString . Ketika dipanggil metode ini mengembalikan nilai zona, tidak ada yang dicetak browser bagus untuk kita, itu adalah nilai aktual dalam objek Date.

new Date().getTimezoneOffset()
-330

new Date().toISOString()
"2018-12-04T05:40:37.399Z"

Kedua, JSON.stringify() juga tidak menghapus nilai zona, berikut ini adalah apa yang kita lihat di konsol browser dan sama saja, browser tidak mencetak sesuatu yang bagus untuk kita.

JSON.stringify({d:new Date()})
"{"d":"2018-12-04T05:42:08.973Z"}"

Jadi saya masih percaya adalah bahwa jika API membuat tanggal ISO yang tidak memiliki nilai milidetik dan UI menggunakan beberapa datepicker yang hanya memilih tanggal dan mengubah tanggal maka Angular saat mengirim tanggal kembali dikonversi ke format ISO tidak akan memiliki milidetik nilai.

Pertama saya pikir itu tidak benar mengatakan objek Tanggal tidak memiliki informasi zona waktu.

Saya masih berpikir itu benar untuk mengatakan bahwa :grin: Objek Date _"mewakili satu momen dalam waktu [...] berdasarkan nilai waktu yaitu jumlah milidetik sejak 1 Januari 1970 UTC" _ (sumber: MDN ). Jadi, pada dasarnya setiap instance Date hanya tahu tentang nilai yang satu ini dan semua representasi lainnya diinduksi berdasarkan info itu ditambah status lokal/sistem (seperti offset zona waktu).

#

Objek Date memiliki metode getTimezoneOffset dan toISOString .

Ini adalah metode pada prototipe Date (sumber: MDN ), bukan dari objek Date (alias instance) itu sendiri.

Lebih khusus lagi, nilai getTimezoneOffset() bergantung pada lokal saat ini (pengaturan sistem host). Inilah alasan mengapa tidak ada metode setTimezoneOffset() setara dan mengapa semua objek Date pada sistem yang sama mengembalikan nilai yang sama untuk getTimezoneOffset() , misalnya:

const d1 = new Date('December 15, 2018 12:34:56');  // No timezone; uses the current system locale.
const d2 = new Date('December 15, 2018 12:34:56 GMT+10'); // Uses GTM+10 as timezone.

d1.getTimezoneOffset() === d2.getTimezoneOffset();  // true

Jadi, info zona waktu yang ditentukan dalam representasi string tanggal yang diteruskan ke Date hanya digunakan untuk mengurai string itu dan memetakannya ke waktu tertentu seperti yang dijelaskan di atas. Objek Date dihasilkan tidak tahu apa-apa tentang zona waktu :smiley:

Metode toISOString() tidak mencetak info zona waktu seperti yang Anda sarankan. Itu hanya menambahkan Z di akhir, yang menunjukkan UTC .

#

Kedua, JSON.stringify() juga tidak menghapus nilai zona

Seperti dijelaskan di atas, ia menggunakan toISOString() , yang menyatakan nilai tanggal dalam UTC (dengan demikian menambahkan Z di akhir untuk menunjukkan itu). Tidak ada info zona waktu dalam string yang dikembalikan.

#

Jadi saya masih percaya adalah bahwa jika API membuat tanggal ISO yang tidak memiliki nilai milidetik dan UI menggunakan beberapa datepicker yang hanya memilih tanggal dan mengubah tanggal maka Angular saat mengirim tanggal kembali dikonversi ke format ISO tidak akan memiliki milidetik nilai.

Saya tidak tahu apa hubungannya dengan milidetik. Kami berbicara tentang info zona waktu.

Sekali lagi, ini tidak ada hubungannya dengan AngularJS. Beginilah cara objek bawaan (seperti Date dan JSON ) berinteraksi satu sama lain.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat