在本地时区以毫秒为单位创建moment.js日期

时间:2018-09-24 13:04:39

标签: javascript date timezone momentjs moment-timezone

我从服务器获得的响应是​​“本地”时间戳。 这意味着我的本地时间以UTC毫秒表示,但没有UTC偏移量。

例如:1537747200000Mon Sep 24 2018 00:00:00 UTC Mon Sep 24 2018 03:00:00 EEST (my local time),但就我而言,该日期实际上是Mon Sep 24 2018 00:00:00 EEST,因此utc值与我的时区相同。

我现在想在需要时使用moment和moment-timezone来显示此内容。

所以我想知道的是如何创建一个包含"LOCAL milliseconds"?的新矩对象,以便在需要时传递1537747200000和本地时区,并将其显示为{{1} }


我发现使用矩时区+ utcOffset可以解决问题,但是我真的不知道这是否是一个好方法。 utc offset docs says this:

  

通过提供分钟数来设置UTC偏移量。请注意,一旦设置了偏移量,它便会固定不变,并且不会单独更改(即没有DST规则)。如果您想要一个实际的时区-在特定位置的时间,例如America / Los_Angeles,请考虑一下“时区”。


另一种方法是将矩格式化为ISOString Mon Sep 24 2018 00:00:00 EEST,然后在没有时区信息(“ z”)的情况下解析结果字符串。解析字符串时,可以在另一个时区进行解析。 moment(1537747200000).toISOString()。但这需要我parse-> format-> parse值,所以这是很多额外的操作。


moment.tz(moment(1537747200000).toISOString().slice(0, -1), tz)
const [one, two, thr] = ["exp","tr","appr"];
const display = (toAdd, id) => document.getElementById(id).innerHTML += `<br/> ${toAdd}`;


const formatString = "MMM D, YYYY HH:mm z";
const tz = moment.tz.guess();
const millis_24_sep_00_00_utc = moment.utc("24-09-2018", "DD-MM-YYYY", true).valueOf(); //1537747200000
const isoString = moment(millis_24_sep_00_00_utc).toISOString();

//exp
display(tz, one);
display(millis_24_sep_00_00_utc, one);
const ex = moment.tz(millis_24_sep_00_00_utc, tz).utc().format("MMM D, YYYY HH:mm")
display(`${ex} ${moment().tz(tz).zoneAbbr()} <- local tz`, one);

//tr
[
  moment(millis_24_sep_00_00_utc).tz(tz),
  moment.utc(new Date(millis_24_sep_00_00_utc)).tz(tz),
  moment.tz(millis_24_sep_00_00_utc, tz).utc(),
  moment.tz(isoString, tz),
]
.forEach(mom => display(mom.format(formatString), two));

//some approaches
[
//setting utcOffset to 0
  moment.tz(millis_24_sep_00_00_utc, tz).utcOffset(0),
//iso string to transform millis -> string -> parse the string in another tz
  moment.tz(isoString.slice(0, -1), tz),
]
.forEach(mom => display(mom.format(formatString), thr));

1 个答案:

答案 0 :(得分:0)

提供已偏移的毫秒时间值是不寻常的。但是,如果您的时间值偏移+3小时,那么您可以减去3小时的毫秒数(1.08e7),并将其用作UTC时间值。

例如时间值1537747200000通常代表2018-09-24T00:00:00.000Z。如果该时间值实际代表2018-09-24T00:00:00.000 + 0300,则等效UTC时间值为:

1537747200000 - 1.08e7 = 1537736400000;

工作示例:

var d = new Date(1537747200000 - 1.08e7);
console.log(`Zulu: ${d.toISOString()}\nLocal: ${d.toString()}`);