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


84

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

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

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

Answers:


139

您无需为此使用moment-timezone。main 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:00或的时区偏移量Z,则可以直接使用进行解析moment。您无需使用.utc.local。例如:

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

4
您应该意识到,此方法未考虑DST偏移量,因此使用moment-timezone库更安全
Jaime Agudo 2015年

2
@Jaime不正确。 local确实考虑了DST。
马特·约翰逊·品脱

您可以自己检查例如从fromEST转换CET,如果您想要NY->的话,明天再举一个例子Madrid。我会接受反例:)
Jaime Agudo 2015年

1
您是正确的,如果没有矩时区,矩就无法进行这种类型的转换。但是,OP可以正确地在UTC和本地之间进行转换。
马特·约翰逊·品脱

2
本地规则来自浏览器。因此,只要本地时区包含DST,时刻就会使用它。
马特·约翰逊·品脱

23
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. 创建一个矩对象,并将该对象的UTC标志设置为true。
  3. 创建一个从原始矩对象转换而来的本地矩对象。
  4. 从本地化的矩对象返回格式化的字符串。

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


如果它解释了为什么可行,甚至可以参考文档,则该答案会更好。此外,您可能想解释一下这个答案与3月份发布的答案有何不同...
Heretic Monkey

@AndrewHenderson,时间比本地机器时间早一小时。为什么会这样?
Ramesh Papaganti

@RameshPapaganti也许是夏令时?例如PDT与PST。众所周知,Moment会在版本之间更改API,尤其是在本地化方面。让我知道您是否找到了原因。
AndrewHenderson

6

这是我所做的:

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

{{ time }}utc时间戳在哪里。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.