Del servidor obtengo una variable de fecha y hora en este formato: 6/29/2011 4:52:48 PM
y está en hora UTC. Quiero convertirlo al tiempo de navegación del usuario actual usando JavaScript.
¿Cómo se puede hacer esto usando JavaScript o jQuery?
Del servidor obtengo una variable de fecha y hora en este formato: 6/29/2011 4:52:48 PM
y está en hora UTC. Quiero convertirlo al tiempo de navegación del usuario actual usando JavaScript.
¿Cómo se puede hacer esto usando JavaScript o jQuery?
Respuestas:
Agregue 'UTC' a la cadena antes de convertirla a una fecha en javascript:
var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
!
Tenga cuidado !
_ ... el análisis de cadenas de fecha con el constructor Date (y Date.parse, son equivalentes) no se recomienda debido a las diferencias e inconsistencias del navegador ... (lo que probablemente fue aún más cierto en 2011)
En mi punto de vista, los servidores siempre deben, en el caso general, devolver una fecha y hora en el formato estandarizado ISO 8601 .
Más información aquí:
En este caso, el servidor volvería, '2011-06-29T16:52:48.000Z'
lo que alimentaría directamente al objeto JS Date.
var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);
El localDate
estará en la hora local correcta que en mi caso serían dos horas más tarde (tiempo DK).
Usted realmente no tiene que hacer todo esto complica el análisis que acaba de cosas, siempre y cuando sean compatibles con el formato de lo que puede esperar del servidor.
DateTime
objeto con el .toString("o")
que devuelve una cadena con formato ISO-8601 como se muestra arriba. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx En javascript es new Date().toISOString()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Esta es una solución universal:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);
var offset = date.getTimezoneOffset() / 60;
var hours = date.getHours();
newDate.setHours(hours - offset);
return newDate;
}
Uso:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
Mostrar la fecha en función de la configuración local del cliente:
date.toLocaleString();
Para mí las soluciones anteriores no funcionaron.
Con IE, la conversión de fecha y hora UTC a local es un poco complicada. Para mí, la fecha y hora de la API web es '2018-02-15T05:37:26.007'
y quería convertir según la zona horaria local, así que utilicé el siguiente código en JavaScript.
var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
Pon esta función en tu cabeza:
<script type="text/javascript">
function localize(t)
{
var d=new Date(t+" UTC");
document.write(d.toString());
}
</script>
Luego, genere lo siguiente para cada fecha en el cuerpo de su página:
<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
Para eliminar el GMT y la zona horaria, cambie la siguiente línea:
document.write(d.toString().replace(/GMT.*/g,""));
Esto funciona para mi:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
Después de probar algunos otros publicados aquí sin buenos resultados, esto pareció funcionar para mí:
convertUTCDateToLocalDate: function (date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
Y esto funciona al revés, desde la fecha local hasta la UTC:
convertLocalDatetoUTCDate: function(date){
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)
Agregue la zona horaria al final, en este caso 'UTC':
theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
después de eso, use las familias de funciones toLocale () * para mostrar la fecha en la ubicación correcta
theDate.toLocaleString(); // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString(); // "9:52:48 AM"
theDate.toLocaleDateString(); // "6/29/2011"
A la respuesta de Matt le falta el hecho de que el horario de verano podría ser diferente entre Date () y la fecha y hora que necesita convertir; aquí está mi solución:
function ConvertUTCTimeToLocalTime(UTCDateString)
{
var convertdLocalTime = new Date(UTCDateString);
var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;
convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset );
return convertdLocalTime;
}
Y los resultados en el depurador:
UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
//Covert datetime by GMT offset
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
date = new Date(date);
//Local time converted to UTC
console.log("Time: " + date);
var localOffset = date.getTimezoneOffset() * 60000;
var localTime = date.getTime();
if (toUTC) {
date = localTime + localOffset;
} else {
date = localTime - localOffset;
}
date = new Date(date);
console.log("Converted time: " + date);
return date;
}
Esta es una solución simplificada basada en la respuesta de Adorjan Princ:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date);
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return newDate;
}
Uso:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
En caso de que no le importe usar moment.js
y su tiempo esté en UTC, solo use lo siguiente:
moment.utc('6/29/2011 4:52:48 PM').toDate();
si su tiempo no está en utc pero en cualquier otro lugar conocido por usted, use lo siguiente:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
si su tiempo ya está en local, use lo siguiente:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
Para mí, lo más simple parecía usar
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
(Pensé que la primera línea podría ser suficiente, pero hay zonas horarias que están desactivadas en fracciones de horas)
new Date('date string')
, y luego agregué estas dos líneas y parece que regresa con una hora basada completamente en la marca de tiempo UTC del servidor con ajustes realizados para que coincida con la hora local del usuario. Me tiene que preocuparse acerca de las fracciones-de-una-hora husos horarios extraños también ... No estoy seguro de si se sostiene perfectamente todo el tiempo ...
Una cadena de fecha JSON (serializada en C #) se parece a "2015-10-13T18: 58: 17".
En angular, (siguiendo a Hulvej) haga un localdate
filtro:
myFilters.filter('localdate', function () {
return function(input) {
var date = new Date(input + '.000Z');
return date;
};
})
Luego, muestre la hora local como:
{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
Usando el YYYY-MM-DD hh:mm:ss
formato:
var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Para convertir del YYYY-MM-DD hh:mm:ss
formato, asegúrese de que su fecha siga el formato ISO 8601 .
Year:
YYYY (eg 1997)
Year and month:
YYYY-MM (eg 1997-07)
Complete date:
YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second
YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:
YYYY = four-digit year
MM = two-digit month (01=January, etc.)
DD = two-digit day of month (01 through 31)
hh = two digits of hour (00 through 23) (am/pm NOT allowed)
mm = two digits of minute (00 through 59)
ss = two digits of second (00 through 59)
s = one or more digits representing a decimal fraction of a second
TZD = time zone designator (Z or +hh:mm or -hh:mm)
Cosas importantes a tener en cuenta
T
, un espacio no funcionará en algunos navegadores+hh:mm
, el uso de una cadena para una zona horaria (por ejemplo: 'UTC') no funcionará en muchos navegadores. +hh:mm
representa el desplazamiento de la zona horaria UTC.@Adorojan's
La respuesta es casi correcta. Pero la adición de compensación no es correcta ya que el valor de compensación será negativo si la fecha del navegador es anterior a GMT y viceversa. A continuación se muestra la solución con la que vine y está funcionando perfectamente bien para mí:
// Input time in UTC
var inputInUtc = "6/29/2011 4:52:48";
var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
//Print date in UTC time
document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");
var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
//Print date in local time
document.write("Date in Local : " + dateInLocalTz.toISOString());
function convertUtcToLocalTz(dateInUtc) {
//Convert to local timezone
return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
}
Respondo esto si alguien desea una función que muestre la hora convertida a un elemento de identificación específico y aplique la cadena de formato de fecha aaaa-mm-dd aquí date1 es una cadena y ids es la identificación del elemento que se mostrará esa hora.
function convertUTCDateToLocalDate(date1, ids)
{
var newDate = new Date();
var ary = date1.split(" ");
var ary2 = ary[0].split("-");
var ary1 = ary[1].split(":");
var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
newDate.setUTCHours(parseInt(ary1[0]));
newDate.setUTCMinutes(ary1[1]);
newDate.setUTCSeconds(ary1[2]);
newDate.setUTCFullYear(ary2[0]);
newDate.setUTCMonth(ary2[1]);
newDate.setUTCDate(ary2[2]);
ids = document.getElementById(ids);
ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
}
Sé que la respuesta ya ha sido aceptada, pero llegué aquí por Google y resolví inspirarme en la respuesta aceptada, así que solo quería compartirla si alguien lo necesita.
Basado en la respuesta @digitalbath, aquí hay una pequeña función para tomar la marca de tiempo UTC y mostrar la hora local en un elemento DOM dado (usando jQuery para esta última parte):
https://jsfiddle.net/moriz/6ktb4sv8/1/
<div id="eventTimestamp" class="timeStamp">
</div>
<script type="text/javascript">
// Convert UTC timestamp to local time and display in specified DOM element
function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);
}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
</script>
Escribí un pequeño script agradable que toma una época UTC y lo convierte en la zona horaria del sistema cliente y lo devuelve en formato d / m / YH: i: s (como la función de fecha PHP):
getTimezoneDate = function ( e ) {
function p(s) { return (s < 10) ? '0' + s : s; }
var t = new Date(0);
t.setUTCSeconds(e);
var d = p(t.getDate()),
m = p(t.getMonth()+1),
Y = p(t.getFullYear()),
H = p(t.getHours()),
i = p(t.getMinutes()),
s = p(t.getSeconds());
d = [d, m, Y].join('/') + ' ' + [H, i, s].join(':');
return d;
};
Puede usar momentjs , moment(date).format()
siempre dará resultado en la fecha local .
Bonificación , puede formatear de la forma que desee. Por ej.
moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd'); // Friday
moment().format("MMM Do YY");
Para más detalles, puede consultar el sitio web de Moment js
Puede hacerlo usando el archivo moment.js .
Es simple, solo has mencionado el lugar de la zona horaria.
Ejemplo: si convierte su fecha y hora a la zona horaria de Asia / Calcuta, solo tiene que mencionar el nombre del lugar de la zona horaria obtenido de moment.js
var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
He creado una función que convierte todas las zonas horarias en hora local.
No utilicé getTimezoneOffset (), porque no devuelve el valor de compensación adecuado
Requisitos:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
En mi caso, tuve que encontrar la diferencia de fechas en segundos. La fecha era una cadena de fecha UTC, por lo que la convertí en un objeto de fecha local. Esto es lo que hice:
let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() *
60000);
utc2 = dateForCompare;
const seconds = Math.floor(utc1 - utc2) / 1000;
function getUTC(str) {
var arr = str.split(/[- :]/);
var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
return utc;
}
Para otros que visiten, use esta función para obtener un objeto de fecha local de una cadena UTC, debe ocuparse del horario de verano y funcionará en IE, iPhone, etc.
Dividimos la cadena (dado que el análisis de fechas JS no es compatible con algunos navegadores) Obtenemos la diferencia de UTC y la restamos de la hora UTC, lo que nos da la hora local. Dado que el desplazamiento devuelto se calcula con DST (corrígeme si estoy equivocado), por lo que volverá a establecer ese tiempo en la variable "utc". Finalmente devuelve el objeto de fecha.
En Angular utilicé la respuesta de Ben de esta manera:
$scope.convert = function (thedate) {
var tempstr = thedate.toString();
var newstr = tempstr.toString().replace(/GMT.*/g, "");
newstr = newstr + " UTC";
return new Date(newstr);
};
Editar: Angular 1.3.0 agregó soporte UTC al filtro de fecha, aún no lo he usado, pero debería ser más fácil, aquí está el formato:
{{ date_expression | date : format : timezone}}