Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 从datetime字符串获取偏移量并应用于新的日期对象_Javascript_Date_Datetime_Object_Momentjs - Fatal编程技术网

Javascript 从datetime字符串获取偏移量并应用于新的日期对象

Javascript 从datetime字符串获取偏移量并应用于新的日期对象,javascript,date,datetime,object,momentjs,Javascript,Date,Datetime,Object,Momentjs,我从后端返回了一个日期时间字符串,如下所示: 2018-12-30T20:00:00-05:00 我正在尝试从这个日期时间字符串获取偏移量,并将其应用于新的日期对象 当我这么做的时候。。。我得到的是客户的时区日期,而不是我想要的 var time = "2018-12-30T20:00:00-05:00" new Date(time) 我不介意利用momentjs或JS中的任何其他库,但我正在尝试在前端实现这一点 更新 如果从我的后端返回的日期的偏移量为-05:00。。。然后当我在前端创建日

我从后端返回了一个日期时间字符串,如下所示:

2018-12-30T20:00:00-05:00
我正在尝试从这个日期时间字符串获取偏移量,并将其应用于新的日期对象

当我这么做的时候。。。我得到的是客户的时区日期,而不是我想要的

var time = "2018-12-30T20:00:00-05:00"
new Date(time)
我不介意利用momentjs或JS中的任何其他库,但我正在尝试在前端实现这一点

更新

如果从我的后端返回的日期的偏移量为-05:00。。。然后当我在前端创建日期对象时。。。它应该具有相同的偏移量

例如:

2018-12-31T10:00:00-05:00

如果您愿意使用
时刻
,您可以使用
utcOffset
轻松提取日期/时间的偏移量。您可以使用相同的功能将偏移应用于新的日期/时间。这里有两个力矩对象,它们表示相同的时间,但偏移不同。这将在不更改绝对时间的情况下将第二个转换为第一个的偏移:

var time=“2018-12-30T10:00:00-05:00”
设m=时刻。解析区域(时间)
let offset=m.utcOffset()
log(“原始:”,m.format(),“偏移量:”,偏移量)
//与集合的m相同,但为-1
假设m2=力矩parseZone(“2018-12-30T14:00:00-01:00”)
console.log(“m2原件:,m2.format())
//更改偏移量
m2.utcOffset(偏移量)
console.log(“m2转换:”,m2.format())

下面是一个非常粗略的例子,说明了如何使用纯JS实现这一点,对于那些来到这里但不想使用矩JS的人来说:

const d=新日期(“2018-12-30T20:00:00-05:00”);
常量epochTimeDate=d.getTime();//从Unix纪元开始获取毫秒数
const localtzOffsetMillimes=d.getTimezoneOffset()*(60*1000);//将分钟转换为毫秒
常数msCoefficient=(60*60*1000);
常数newTZOffsetHours=-3;//UTC-3
常量newTZTime=新日期(epochTimeDate-(-1*(newTZOffsetHours*msCoefficient));//-1反转了浏览器规范的混乱行为,该行为与实际偏移相反

console.log(newTZTime.toISOString().replace(/T|Z/g')+“(UTC”+newTZOffsetHours+”)您需要从字符串中获取时区,然后将其转换为ECMAScript偏移量,并使用它格式化具有所需偏移量的字符串

上面已经有答案了,但这里还是有答案的

例如

/*返回偏移量,使用匹配允许时间戳中的十进制秒
**@param{string}s-带偏移量的ECMAScript格式的日期时间字符串
**格式为YYYY-MM-DDTHH:MM:ss+/-HH:MM或Z
**@returns{string}-字符串的偏移部分,即+/-HH:mm或Z
*/
函数getOffset(s){
返回偏移量=(s.match(/z$|[+\-]\d\d:\d\d$/i)| |[])[0];
}
/*将+/-HH:mm格式或Z格式的偏移量转换为ECMAScript偏移量
**@param{string}偏移量-采用+/-HH:mm格式或Z
**@returns{number}-ECMSCript偏移量(分钟),即-ve东、+ve西
*/
函数偏移量(偏移量){
//处理Z或Z
if(/z/i.test(offset))返回0;
//交易+/-HH:mm
变量符号=/^-/.测试(偏移量)?“1”:“1”;
var[h,m]=offset.slice(-5).split(':');
返回符号*h*60++m;
}
/*用偏移量格式化日期
**@param{Date}Date-要格式化的日期
**@param{string}offset-ECMASCript offset string,
**例如-05:00,Z
**@returns{string}ISO 8601格式的字符串,带有
**指定偏移量
*/
功能调整偏移量(日期、偏移量){
var o=偏移量(偏移量);
var d=新日期(+日期);
d、 setUTCMinutes(d.getUTCMinutes()-o);
返回d.toISOString().replace('Z',offset);
}
//源字符串
var s='2018-12-30T20:00:00-05:00';
//获得偏移量
var offset=getOffset;
//确保一切正常
如果(偏移量的类型==“未定义”){
console.log(“未找到偏移量”);
//否则,显示具有指定偏移量的当前时间
}否则{
日志(adjustToOffset(新日期(),偏移量));

}
您的问题有点模糊,因为有多种方法可以解释对日期应用偏移量-您可以将其转换为新的绝对时间,可以保持绝对时间不变,但应用新的偏移量,等等。如果您给出一个正确的日期/时间前后的示例,这会有所帮助。@MarkMeyer添加了一个示例您是否尝试使用普通方式?@Jin是的,但它与客户端偏移量一起使用,而不是使用-5偏移量,那么您预期的结果是什么?你能举个例子吗?对于上面的文本,我听说ISOString存在跨浏览器兼容性问题,但这仍然是一个很好的答案。您不需要像那样处理毫秒,只需调整UTC分钟数即可。