Javascript 使用moment.js更改日期时间戳上的时区,而不更改时间
我正在使用NodeJS将事件数据从旧的SQL数据库迁移到新的Mongo数据库。但是,无论是谁设置了SQL数据库,都会创建事件的所有日期,并以PST/PDT表示时间,但数据库认为它们是UTC时间 例如: SQL数据库中的日期可能是:Javascript 使用moment.js更改日期时间戳上的时区,而不更改时间,javascript,node.js,datetime,momentjs,Javascript,Node.js,Datetime,Momentjs,我正在使用NodeJS将事件数据从旧的SQL数据库迁移到新的Mongo数据库。但是,无论是谁设置了SQL数据库,都会创建事件的所有日期,并以PST/PDT表示时间,但数据库认为它们是UTC时间 例如: SQL数据库中的日期可能是:23-APR-10,当21:00:00为PST时间时,该时刻js显示为:2010-04-23T21:00:00Z 是否可以使用纯JavaScript/MomentJS/NodeJS或其他npm模块在不修改时间的情况下更改日期时间字符串上的时区(即2010-04-23T2
23-APR-10
,当21:00:00
为PST时间时,该时刻js显示为:2010-04-23T21:00:00Z
是否可以使用纯JavaScript/MomentJS/NodeJS或其他npm模块在不修改时间的情况下更改日期时间字符串上的时区(即2010-04-23T21:00:00Z
将变成2010-04-23T21:00:00-8:00
)
注:尽管SQL数据库仅显示DD-MMM-YY,但在我查询时返回一个日期时间字符串。按照问题注释中的查询行,您的问题似乎是由于时区问题,存储在db中的时间戳没有时区偏移,并且由于您所需的时区是PST(UTC-8小时),时间戳提前了8个小时,例如,应该是
2010-04-23T13:00:00Z
的时间戳已经变成2010-04-23T21:00:00Z
因此,这里需要做的是获取所需时区的utc偏移量,并将其添加到日期中
您案例中的偏移量是已知的(-8小时)。但是,我们可以从时刻时区
库中获取任何所需时区的正确偏移量
const moment_timezone = require('moment-timezone');
//a sample timestamp you're getting from your db
const myDateObj = new Date("2010-04-23T21:00:00Z");
//timezone for PST as understood by moment-timezone
const myMomentTimezone = "America/Los_Angeles";
//offset for your timezone in milliseconds
const myTimezoneOffset = moment_timezone.tz(myMomentTimezone).utcOffset()*60000;
//perfom the correction
const getCorrectedDateObj = (givenDateObj) => new Date(givenDateObj.valueOf() + myTimezoneOffset);
console.log(getCorrectedDateObj(myDateObj));
const moment_timezone=require('moment-timezone');
//从数据库中获取的时间戳示例
const myDateObj=新日期(“2010-04-23T21:00:00Z”);
//按时刻时区理解的PST时区
const myMomentTimezone=“美国/洛杉矶”;
//时区的偏移量(毫秒)
const myTimezoneOffset=moment\u timezone.tz(myMomentTimezone.utcOffset()*60000;
//执行更正
const getCorrectedDateObj=(GivenDeobj)=>新日期(GivenDeobj.valueOf()+myTimezoneOffset);
log(getCorrectedDateObj(myDateObj));
您可能会注意到,我们实际上在更改时间戳,因为由于错误的性质,给定的时间戳和重新请求的时间戳本质上是不同的时间戳。此时时区仅用于获取偏移量,而不用于“转换”任何内容。然而,Anuj Pancholi的回答是正确的;我使用的旧SQL数据库似乎有很多怪癖,所以我不得不修改他的答案以使代码正常工作 我的解决方案:
function getCorrectedDateObj(myDateObj){
const timezoneOffset = momentTimeZone.tz(timezone).utcOffset() * 60000;
const dt = new Date(myDateObj.valueOf() + timezoneOffset / 2);
dt.setHours(dt.getHours() + 12);
}
我不清楚mongodb以字符串的形式返回什么,以及解析该字符串时从momentjs中得到什么。你能详细说明一下吗?@OrkhanAlikhanov SQL数据库我从returns中获取数据
2010-04-23T21:00:00Z
,当我尝试使用momentjs将其转换为PST时,我得到2010-04-23T13:00:00-8:00
。但是,我正在尝试将:2010-04-23T21:00:00-8:00
放入我的MongoDB。如果SQL数据库发送2010-04-23
,而您发送时刻('2010-04-23')
,它将根据您的本地时区进行解析。如果您使用time.utc('2010-04-23')
您将在utc中获得它。我建议将UTC始终存储在数据库中。然后在服务器中,您可以将其转换为任何time@OrkhanAlikhanovSQL数据库发送2010-04-23T21:00:00Z
,这是PST时间,但数据库认为这是utc时间。我试图通过更改时区偏移量来修复不正确的UTC,以便将其保存到我的数据库中作为(正确的)UTC。@OrkhanAlikhanov,我的错误是混淆了您,我应该在我之前的评论中说我试图将2010-04-23T13:00:00Z
保存到我的数据库中(因为这更准确)