如何将 Moment.js 日期转换为用户本地时区?

IT技术 javascript date timezone momentjs
2021-03-13 18:55:39

我使用 Moment.js 和 Moment-Timezone 框架,并且有一个 Moment.js 日期对象,它明确地在 UTC 时区。如何将其转换为浏览器的当前时区?

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

所以如果我能找出用户本地时区就好了;或者,我想将日期对象转换为另一个只使用“本地时区”的数据对象,无论实际是什么。

5个回答

您不需要为此使用时刻时区。主要的 moment.js 库具有使用 UTC 和本地时区的完整功能。

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

从那里您可以使用您可能期望的任何功能:

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

请注意,通过将testDateUtc一个moment对象传递moment()构造函数,它会创建一个clone否则,当您调用 时.local(),它也会更改testDateUtc值,而不仅仅是localDate值。时刻是可变的

另请注意,如果您的原始输入包含时区偏移量,例如+00:00Z,那么您可以直接使用moment. 您不需要使用.utc.local例如:

var localDate = moment("2015-01-30T10:00:00Z");
本地规则来自浏览器。所以只要本地时区包含 DST,moment 就会使用它。
2021-04-23 18:55:39
你可以自己检查,例如从ESTto翻译CET,如果你想要,我明天会举一个例子NY-> Madrid我会接受反例:)
2021-04-26 18:55:39
@Jaime 不是真的。 local确实考虑了夏令时。
2021-05-01 18:55:39
你是对的,没有时刻时区就不能进行那种类型的转换。但是,它可以在 UTC 和本地之间正确转换,这是 OP 所要求的。
2021-05-09 18:55:39
你应该知道这个方法没有考虑 DST 偏移量,使用moment-timezone更安全
2021-05-12 18:55:39
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. 定义日期格式。
  2. 创建一个 moment 对象并将对象上的 UTC 标志设置为 true。
  3. 创建从原始力矩对象转换而来的局部力矩对象。
  4. 从本地化的矩对象返回格式化的字符串。

请参阅:http : //momentjs.com/docs/#/manipulating/local/

@RameshPapaganti 也许是夏令时?例如 PDT 与 PST。众所周知,Moment 会在版本之间更改 API,尤其是在本地化方面。如果您找到原因,请告诉我。
2021-04-30 18:55:39
如果它解释了为什么会起作用,也许会参考文档,这个答案会更好。另外,您可能想解释一下这个答案与三月份发布的答案有何不同......
2021-05-08 18:55:39
@AndrewHenderson,时间比本地机器时间早一小时。为什么会这样?
2021-05-13 18:55:39

这是我所做的:

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

{{ time }}UTC 时间戳在哪里

使用 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

获取用户时区的最佳方法是使用 moment-timezone

import moment from 'moment-timezone'

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)

这样您就可以将您的时间转换为本地时区的特定时间

moment.tz 不存在
2021-04-26 18:55:39
@huykon225 它确实存在。这不是时刻包而是“时刻时区”
2021-05-01 18:55:39