Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用moment.js更改日期时间戳上的时区,而不更改时间_Javascript_Node.js_Datetime_Momentjs - Fatal编程技术网

Javascript 使用moment.js更改日期时间戳上的时区,而不更改时间

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

我正在使用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-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
保存到我的数据库中(因为这更准确)