javascript - fechas - i18n angular 6
angular $ http.post cambio de fecha a fecha UTC (9)
¿Agregó la biblioteca angular-locale_en-in.js a su aplicación? Algo como esto....
angular.module(''myAngularApp'', [
''ngLocale''])
De lo contrario, la biblioteca js no tendrá ningún efecto en su aplicación angular.
Estaba intentando publicar algunos datos en mi API REST que tiene fecha. Ahora, mientras depuro, mi parámetro de fecha es un objeto JS Date con la fecha correcta en mi zona horaria: Tue Apr 04 2017 00:00:00 GMT+0530
después de que deja mi código, y veo lo mismo en la pestaña de red, se convierte a la fecha UTC: "2017-04-03T18:30:00.000Z"
Busqué la solución según la cual necesito incluir el archivo de configuración regional de angular en mi index.html que hice:
<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script>
pero no ayuda He visto soluciones como agregar formato de fecha para filtrar o algo, pero quiero una solución global. ¿Alguna ayuda? Gracias :)
Agregue UTC al final para que el navegador lo convierta en fecha UTC.
var dateToServer =new Date(dateFromUser+" UTC");
ahora el dateToServer será en formato UTC DateTime.
Como sugirió charlietfl, probablemente el hack global sería anular el método Date.prototype.toJSON (), pero esa no es una buena práctica.
¿Dónde estás usando tu llamada $ http.post? El mejor lugar para enviar una solicitud de $ http estaría en un servicio. Si utiliza un servicio, le sugiero que envuelva su API de servicio público, de modo que pueda tener métodos "públicos" y "privados": podrían ser utilidades para realizar operaciones comunes, como transformaciones de datos, validaciones ...
angular.service(''bookStoreService'', [''$http''], function($http) {
var normalizeBooks = function(booksArray){
booksArray.forEach(function(book){
// do something on the book
});
};
var updateBooks = function(books){
normalizeBooks(books);
$http.post(''myurl'', books);
};
return {
updateBooks : updateBooks
};
});
Creo que solo puede pasarlo como una cadena (si la API utiliza las cadenas aceptadas) con el formato que necesita, digamos "mar. 04 de abril de 2017 00:00:00 GMT + 0530" y guárdelo en el back-end como una cadena y luego, cuando lo recupere, será una cadena y por lo tanto no se cambiará de ninguna manera.
Jindal saab, funcionará así. Cuando seleccionamos cualquier fecha con el selector de fecha o simplemente pasamos cualquier valor, toma la fecha local original, pero cuando pasamos ese valor aún más, la convierte en UTC, luego debe convertirse a la zona local nuevamente en el extremo receptor. La base de datos guarda la fecha y hora en formato UTC.
Json serializador fecha de análisis de la cadena. En un cliente, las propiedades de fecha se almacenan como fecha local en la zona horaria del navegador. Cuando está publicando su objeto en el servidor, todas las propiedades de fecha se convierten en una cadena utc. En la mayoría de los casos es un buen comportamiento. Pero a veces necesita establecer y enviar la fecha en una zona horaria del servidor. A menudo es necesario cuando debe establecer solo la fecha sin la hora. En ese caso, debe definir la propiedad de la cadena y establecerla manualmente. Usualmente aplico este truco.
class Obj{
d: Date
}
class ObjDto{
constructor(obj: Obj){
this.d= dateTimeToIsoLocalDateString(obj.d)
}
d: string
}
...
export function DateTimeToDate(date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
}
export function dateTimeToIsoLocalDateString(dateTime: Date): string {
if (dateTime === null) {
return null;
}
let date = DateTimeToDate(dateTime);
let res = date.toISOString().replace("Z", "");
return res;
}
Para entender mejor este tema, puedes aprender este topic
La fecha de manejo, la hora y la zona horaria también me han confundido. Puede ser que esta respuesta te dé una idea de cómo puedes manejarlos.
Pruebe el siguiente código en la consola de desarrolladores de Chrome y vea cómo se presenta la misma fecha en diferentes formatos:
var date = new Date();
date.toISOString(); // "2017-04-29T09:54:28.714Z"
date.toGMTString(); //"Sat, 29 Apr 2017 09:54:28 GMT"
date.toLocalString(); //"4/29/2017, 3:24:28 PM"
Cualquier fecha que cree en el cliente siempre registra la fecha en cero desplazamiento de zona horaria, es decir, UTC+/-00:00 Z
Para simplificar, puede pensar UTC y GMT como iguales. Cuando se trata de mostrar el propósito, la misma fecha se presenta según la zona horaria del navegador. Si Sat Apr 29 2017 15:24:28 GMT+0530 (IST)
console.log (date)
saldrá el Sat Apr 29 2017 15:24:28 GMT+0530 (IST)
pero eso no significa que la grabación interna de la fecha sea según la zona horaria del navegador. Se presenta en la pantalla / consola según la zona horaria del navegador.
Observe las representaciones de fecha no como convertidas de una zona horaria a otra, pero considérelas como una representación diferente de la misma fecha. En su navegador, se representa como GMT+0530
offset y cuando se envía al servidor es la misma fecha en cero offset de zona horaria.
Según su comentario, si elige el 4 de abril a las 00:00 AM en la zona horaria GMT + 0530, internamente será el 3 de abril a las 18:30 PM a las GMT + 0, es decir, a cero desplazamiento de la zona horaria. Déjalo ir al servidor como está. Cuando necesite usar esta fecha, regresará del servidor como el 3 de abril y se mostrará en el navegador según la compensación de la zona horaria del navegador. No hay conversión involucrada, es una fecha con representación diferente.
Una vez hice una pregunta relacionada , puede ser que esto agregue más aclaraciones.
Y en general, esta respuesta sigue siendo la misma que las respuestas de @geminiousgoel y @charlietfl.
Pasar la fecha UTC al servidor es el comportamiento deseado. Se supone que las API de los clientes manejan la hora UTC en lugar de suponer que las fechas son todas fechas locales.
Pero de todos modos, puede convertir la fecha en una cadena según la zona horaria local y pasar la cadena al servidor.
Escenario:
Envíe la fecha desde la UI
de UI
a la API call
como un epoch time
( epoch time
UNIX) en lugar de una cadena de date
. Puede utilizar el método getTime() para convertir la fecha en tiempo de época.
var dateStr = "Tue Apr 04 2017 00:00:00 GMT+0530";
var dateEpoch = new Date(dateStr).getTime();
console.log(dateEpoch); // 1491244200000 (Local Time)
Al final del receptor, tienen que convertir esta epoch time
( epoch time
UNIX) en Date
nuevamente. Dará la misma fecha / hora local que pasa de la UI
.