Convertir hora de fecha UTC a hora de fecha local

337

Del servidor obtengo una variable de fecha y hora en este formato: 6/29/2011 4:52:48 PMy 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?

Amr Elgarhy
fuente
1
Ten cuidado. Es un formato de fecha extraño, así que asegúrese de especificarlo en cualquier solución que use. Si es posible, haga que el servidor envíe la fecha en formato ISO.
Michael Scheper

Respuestas:

404

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)"
baño digital
fuente
55
función localizeDateStr (date_to_convert_str) {var date_to_convert = new Date (date_to_convert_str); var local_date = nueva Fecha (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); return date_to_convert.toString (); }
mate
44
@matt offSet devuelve minutos, no horas, debe dividir por 60
bladefist
50
Esto supone que la parte de la fecha de la cadena sigue el estándar de EE. UU., Mm / dd / AAAA, que obviamente no es el caso en Europa y en otras partes del mundo.
AsGoodAsItGets
77
@digitalbath Funciona en Chrome pero no funciona en Firefox.
Ganesh Satpute
138

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 localDateestará 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.

Hulvej
fuente
1
¿Cómo obtener la fecha de formato iso? Recibo la fecha en formato UTC con UTC agregado al final
Deepika
8
@Colin depende del idioma. En C # puede formatear un DateTimeobjeto 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/…
Hulvej
99

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();
Adorjan Princz
fuente
41
No funciona con todas las zonas horarias. ¡Hay una buena razón por la que getTimeZoneOffset está en minutos! geographylists.com/list20d.html
siukurnin
55
@siukurnin. así que para administrar zonas horarias extrañas, use newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre el
18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) sería suficiente. En horas corregidas también
Lu55
1
¿Estás bastante seguro de que esto no puede funcionar para cualquier zona horaria que esté a 30 minutos? Parece redondear a horas enteras.
NickG
2
Esto tampoco parece establecer la fecha correctamente cuando el cambio de zona horaria cruza la medianoche; posiblemente porque solo está usando setHours que no afecta la fecha?
Uniphonic
37

Debe obtener el desplazamiento (UTC) (en minutos) del cliente:

var offset = new Date().getTimezoneOffset();

Y luego, haga la suma o resta correspondiente al tiempo que obtiene del servidor.

Espero que esto ayude.

Nobita
fuente
2
¿Qué pasa con el horario de verano?
Rico
26

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');
PramodB
fuente
21

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,""));
Ben Bryant
fuente
20

Esto funciona para mi:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}
Molp Burnbright
fuente
10

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());
}
Unifónico
fuente
1
Menos código para usar new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG
no funcionará, mi tiempo en utc es "2020-04-02T11: 09: 00", así que probé esto desde Singapur, nueva fecha (+ nueva fecha ("2020-04-02T11: 09: 00") + nueva fecha ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), dando el momento equivocado
AhammadaliPK
esto funcionó, nueva fecha ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK
10

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"
pabloa98
fuente
9

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)
MaurGi
fuente
9

Use esto para UTC y conversión de hora local y viceversa.

//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;
}
Mr. Polywhirl
fuente
3
lo que sucedió en el horario de verano. Zona horaria CET
NovusMobile
mira mi respuesta @ stackoverflow.com/questions/6525538/…
Hulvej
9

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));
huha
fuente
¿Por qué se rechazó esto el 9 de octubre de 2017? Por favor escriba un comentario para ayudarme a entender su opinión.
huha
9

En caso de que no le importe usar moment.jsy 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');
adnan kamili
fuente
5

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)

mizuki nakeshu
fuente
¿Alguien tiene algún problema con esto? Esta parece ser la mejor opción para mí. Tomé una cadena UTC que tenía "(UTC)" al final, la configuré como un objeto Date usando 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 ...
tylerl
Probé muchas otras opciones, ninguna funcionó, pero esto está funcionando
Sameera K
5

Una cadena de fecha JSON (serializada en C #) se parece a "2015-10-13T18: 58: 17".

En angular, (siguiendo a Hulvej) haga un localdatefiltro:

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' }}
James Howey
fuente
3

Usando el YYYY-MM-DD hh:mm:ssformato:

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:ssformato, 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

  1. Debe separar la fecha y la hora con un T, un espacio no funcionará en algunos navegadores
  2. Debe establecer la zona horaria con este formato +hh:mm, el uso de una cadena para una zona horaria (por ejemplo: 'UTC') no funcionará en muchos navegadores. +hh:mmrepresenta el desplazamiento de la zona horaria UTC.
Gudradain
fuente
3

@Adorojan'sLa 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);
}

Joe
fuente
3

Para mi esto funciona bien

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}
C.Lee
fuente
2

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.

Nisarg Desai
fuente
1

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>
Moriz
fuente
0

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;

};
John Bell
fuente
0

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

Un consumidor
fuente
0

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');

REvathY M
fuente
0

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"
Rohit Parte
fuente
0

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;
Suraj Galande
fuente
-1
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.

Dapu
fuente
-1

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}}

Angular 1.4.3 Fecha API

Helzgate
fuente