将字符串日期转换为时区日期,然后将其本地化-moment js

时间:2019-09-20 11:12:42

标签: momentjs

上下文:

我的数据库中有一个UTC日期选择器和时区选择器。我想在本地时间在前端显示日期,因此在以下示例中,在CMS中,我将11月1日的巴黎设置为10:00,因此我应该在11月1日的伦敦看到09:00。 >

问题:

我已经玩了几个小时了。

我在伦敦时区。

// The following is coming out of my database for an article (Note it's November, after BST or CEST):
var articleDate = "2019-11-01T10:00:00"
var timezoneDisplayName = "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris"

我将articleDate转换为UTC,因为它应该是数据库中的UTC日期:

var articleDateAsUTC = moment.utc(articleDate);

enter image description here

然后我添加时区偏移量,以便日期现在以正确的格式转换为本地时间(您可以看到它说偏移量60并且日期保持不变):< / p>

var articleDateAfterAddingOffset = articleDateAsUTC.utcOffset(timezoneDisplayName);

enter image description here

然后我将其转换为本地时间(您可以看到它仍然偏移60,并且日期保持不变):

var convertDateToLocal = articleDateAfterAddingOffset.local();

enter image description here

最后,我格式化它:

var formattedDate = convertDateToLocal.format(format);

enter image description here

确定日期应该在英国的09:00而在巴黎的10:00?

我在做什么错了?

此处的完整代码:

var articleDate = "2019-11-01T10:00:00"
var timezoneDisplayName = "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris"
var articleDateAsUTC = moment.utc(articleDate);
var articleDateAfterAddingOffset = articleDateAsUTC.utcOffset(timezoneDisplayName);
var convertDateToLocal = articleDateAfterAddingOffset.local();
var formattedDate = convertDateToLocal.format(format);

1 个答案:

答案 0 :(得分:0)

我对此并不完全满意,但看起来我已经找到了解决方案。

我可以访问Windows时区名称,并将其用于我发现的时区映射器,该映射器将其转换为IANA。

然后我将时区框架与矩值一起使用,以进行转换。

//this exists to map windows timezones to IANA used by moment.js
var map = [ { "windowsName": "Romance Standard Time", "territory": "001", "iana": ["Europe/Paris"] } ];    

var foundMapping = map.filter(function(item){
    return item.windowsName == timezone.StandardName;
});

// Regions for some countries have many entries. We are just choosing the first in the array
var chosenMapping = foundMapping[0];

var momentTimezone = chosenMapping.iana[0];

var timezonedDate = moment.tz(articleDate, momentTimezone);
return timezonedDate.local().format(format);

您甚至可以将其用作数据源,这意味着您不必担心我的第一张地图中的区域问题:

boolean indexing