上下文:
我的数据库中有一个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);
然后我添加时区偏移量,以便日期现在以正确的格式转换为本地时间(您可以看到它说偏移量60并且日期保持不变):< / p>
var articleDateAfterAddingOffset = articleDateAsUTC.utcOffset(timezoneDisplayName);
然后我将其转换为本地时间(您可以看到它仍然偏移60,并且日期保持不变):
var convertDateToLocal = articleDateAfterAddingOffset.local();
最后,我格式化它:
var formattedDate = convertDateToLocal.format(format);
确定日期应该在英国的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);
答案 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);
您甚至可以将其用作数据源,这意味着您不必担心我的第一张地图中的区域问题: