¿Cómo convertir la fecha de Moment.js a la zona horaria local de los usuarios?

5 minutos de lectura

avatar de usuario
olivo

Uso los marcos Moment.js y Moment-Timezone, y tengo un objeto de fecha Moment.js que está explícitamente en la zona horaria UTC. ¿Cómo puedo convertir eso a la zona horaria actual del navegador?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC");
var localDate = ???

Así que estaría bien si pudiera averiguar la zona horaria local de los usuarios; o, alternativamente, me gustaría convertir el objeto de fecha en otro objeto de datos que solo use la “zona horaria local”, sin importar cuál sea realmente.

avatar de usuario
Matt Johnson-pinta

No necesita usar moment-timezone para esto. La biblioteca principal de moment.js tiene una funcionalidad completa para trabajar con UTC y la zona horaria local.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Desde allí puede usar cualquiera de las funciones que podría esperar:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Tenga en cuenta que al pasar testDateUtcel cual es un moment objeto, de vuelta al moment() constructor, crea un clon. De lo contrario, cuando llamaste .local()también cambiaría la testDateUtc valor, en lugar de sólo el localDate valor. Los momentos son mudable.

También tenga en cuenta que si su entrada original contiene un desplazamiento de zona horaria como +00:00 o Zentonces puedes analizarlo directamente con moment. No necesitas usar .utc o .local. Por ejemplo:

var localDate = moment("2015-01-30T10:00:00Z");

  • Debe tener en cuenta que este método no tiene en cuenta las compensaciones de DST, es más seguro de usar moment-timezone biblioteca

    – Jaime Agudo

    18 de agosto de 2015 a las 17:14

  • @Jaime no es cierto. local de hecho tiene en cuenta el horario de verano.

    – Matt Johnson-Pint

    18 de agosto de 2015 a las 23:38

  • Puede verificar por su cuenta, por ejemplo, traduciendo de EST a CETte pongo un ejemplo mañana si quieres like NY->Madrid. Acepto el contraejemplo 🙂

    – Jaime Agudo

    18 de agosto de 2015 a las 23:41

  • Tienes razón en que el momento no puede hacer ese tipo de conversión sin la zona horaria del momento. De todos modos, eso pueden convierta correctamente entre UTC y local, que es lo que solicitó el OP.

    – Matt Johnson-Pint

    18 de agosto de 2015 a las 23:44

  • Las reglas locales provienen del navegador. Entonces, siempre que la zona horaria local incluya el horario de verano, el momento lo usará.

    – Matt Johnson-Pint

    18 de agosto de 2015 a las 23:46

avatar de usuario
AndrewHenderson

var dateFormat="YYYY-DD-MM HH:mm:ss";
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Defina su formato de fecha.
  2. Cree un objeto de momento y establezca el indicador UTC en verdadero en el objeto.
  3. Cree un objeto de momento localizado convertido a partir del objeto de momento original.
  4. Devuelve una cadena formateada del objeto de momento localizado.

Ver: http://momentjs.com/docs/#/manipulating/local/

  • Esta respuesta sería aún mejor si explicara por qué funciona, tal vez con referencias a la documentación. Además, es posible que desee explicar en qué se diferencia esta respuesta de la publicada en marzo…

    – Mono hereje

    10 de diciembre de 2015 a las 23:24

  • @AndrewHenderson, el tiempo está una hora por delante del tiempo de la máquina local. ¿Por qué sucede?

    – Ramesh Papaganti

    10 de abril de 2017 a las 14:04

  • @RameshPapaganti ¿Quizás el horario de verano? Por ejemplo, PDT frente a PST. Se sabe que Moment cambia la API entre versiones, especialmente cuando se trata de localización. Avísame si encontraste la causa.

    – Andrew Henderson

    21 de abril de 2017 a las 1:11


Esto es lo que hice:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

Dónde {{ time }} es la marca de tiempo utc.

Utilice la función utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00

avatar de usuario
Nishit

class Time extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      parentTime: '',
      localTime: '',
      parentTz: ''
    }
  }

  componentDidMount() {
    const inputTz = "America/Toronto"
    const originTime = "2013-11-18 11:55"
    const time = moment.tz(originTime, inputTz)
    const localtz = moment.tz.guess()
    const date = time.clone().tz(localtz)
    const formatDate = moment(date).format('MMMM Do YYYY, h:mm:ss A z')
     console.log(formatDate, localtz)
    this.setState({parentTime: originTime, localTime: formatDate, parentTz: inputTz })
  }


  render() {
  const {parentTime, parentTz, localTime} = this.state
    return (
      <div>
      <p>{parentTime}<br/> in {parentTz}<br/> to {localTime}</p>
      </div>
    )
  }
}


ReactDOM.render(
  <Time />,
  document.getElementById('time')
);
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data-1970-2030.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.3.0/react-dom.min.js"></script>
<div id="time"></div>

la mejor manera de obtener la zona horaria de un usuario es usando moment-timezone

import moment from 'moment-timezone'

// using utc time here
const time = moment.tz("2021-04-14T02:08:10.370Z")
const localtz = moment.tz.guess()
const date = time.clone().tz(localtz)
const formatDate = moment(date).format('MMMM Do YYYY, h:mm:ss A z')
console.log(formatDate)

de esta manera podrá convertir su hora en una hora específica de la zona horaria local

  • moment.tz no existe

    – huykon225

    17 dic 2021 a las 10:11

  • @ huykon225 existe. No es el paquete moment sino ‘moment-timezone’

    – Nishit

    18 de diciembre de 2021 a las 7:18

  • Es time parte del paquete moment-timezone o es otro paquete?

    – libélula02

    5 ene a las 10:51

  • @stt106 mira con cuidado una vez más, time es solo un nombre dado a una variable

    – Nishit

    6 ene a las 11:11

  • moment.tz no existe

    – huykon225

    17 dic 2021 a las 10:11

  • @ huykon225 existe. No es el paquete moment sino ‘moment-timezone’

    – Nishit

    18 de diciembre de 2021 a las 7:18

  • Es time parte del paquete moment-timezone o es otro paquete?

    – libélula02

    5 ene a las 10:51

  • @stt106 mira con cuidado una vez más, time es solo un nombre dado a una variable

    – Nishit

    6 ene a las 11:11

¿Ha sido útil esta solución?