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.
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 testDateUtc
el 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 Z
entonces 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
aCET
te pongo un ejemplo mañana si quieres likeNY
->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
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
- Defina su formato de fecha.
- Cree un objeto de momento y establezca el indicador UTC en verdadero en el objeto.
- Cree un objeto de momento localizado convertido a partir del objeto de momento original.
- Devuelve una cadena formateada del objeto de momento localizado.
-
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
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