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
将格式为Sat Dec 30 1899 HH:MM:SS的JavaScript时间戳转换为今天?_Javascript_Date_Datetime_Time - Fatal编程技术网

将格式为Sat Dec 30 1899 HH:MM:SS的JavaScript时间戳转换为今天?

将格式为Sat Dec 30 1899 HH:MM:SS的JavaScript时间戳转换为今天?,javascript,date,datetime,time,Javascript,Date,Datetime,Time,我有一个应用程序,它将轮班开始和结束时间显示为javascript日期,其中日期设置为1899年12月30日周六,并具有适当的开始/结束时间: const start=新日期(-2209139100000);//1899年12月30日星期六06:15:00 GMT+0000(格林威治标准时间) const finish=新日期(-2209095900000);//1899年12月30日星期六18:15:00 GMT+0000(格林威治标准时间) 我的应用程序在这些时候作为json对象的一部分动

我有一个应用程序,它将轮班开始和结束时间显示为javascript日期,其中日期设置为1899年12月30日周六,并具有适当的开始/结束时间:

const start=新日期(-2209139100000);//1899年12月30日星期六06:15:00 GMT+0000(格林威治标准时间)
const finish=新日期(-2209095900000);//1899年12月30日星期六18:15:00 GMT+0000(格林威治标准时间)
我的应用程序在这些时候作为json对象的一部分动态发送。我无法访问时间来自的主服务器,因此无法在源位置更正它们

我想做的是将轮班开始时间转换为今天的日期(以及适当的轮班开始时间),然后将结束时间转换为将来的适当时间。当我的应用程序收到轮班开始时间总是过去的时间(在前12小时内)。班次可以超过午夜(夜班),但班次长度可以变化(6、8、10和12小时),但班次总是在开始时间的24小时内结束


有人能给我一些提示或起点吗?

您可以使用
日期
方法仅更改
日期
实例的日期部分。然后,只需将原始时差添加到新的开始日期,即可获得新的完成时间

const start=新日期(-2209095900000);
const finish=新日期(-2209052700000);
log(“原始开始:”,start.toISOString())
log(“原始完成:”,finish.toISOString())
常数差=完成-开始
const now=新日期()
//克隆开始
const newStart=新日期(开始)
//将日期部分设置为今天
newStart.setUTCFullYear(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate())
//将finish设置为与newStart相同的差异
const newFinish=新日期(newStart.valueOf()+diff)
log(“开始:”,newStart.toISOString())

console.log(“Finish:,newFinish.toISOString())
您可以通过从原始
开始
日期和
date.now()
与该日期之间的天数差创建一个新日期来实现这一点。然后,可以通过将原始
开始
完成
日期之间的差异添加到新的开始日期来创建新的完成日期

const
开始=新日期(-2209095900000),//1899-12-30T18:15:00.000Z
完成=新日期(-2209139100000);//1899-12-30T06:15:00.000Z
让
shiftTime=完成/开始;
//如果开始时间晚于完成时间,则添加一天
如果(移位时间<0)移位时间+=8.64e7;
常数
startVal=start.valueOf(),
dayDiff=(Math.floor(Date.now()/8.64e7)-Math.floor(startVal/8.64e7))*8.64e7,
newStartVal=startVal+dayDiff;
常数
newStart=新日期(newStartVal),
newFinish=新日期(newStartVal+shiftTime);
console.log('Start');
console.log('old:',start);
log('new:',newStart);
console.log('Finish');
console.log('old:',finish);
log('new:',newFinish)

.as console wrapper{max height:100%!important;top:0;}
这是我已经解决的问题,似乎正在发挥作用:

const now=new Date();
const start=新日期(-2209095900000);
const finish=新日期(-2209139100000);
const newStart=新日期(开始);
newStart.setUTCFullYear(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate());
const newFinish=新日期(finish);
newFinish.setUTCFullYear(现在是.getUTCFullYear(),现在是.getUTCMonth(),(开始>完成)?现在是.getUTCDate()+1:now.getUTCDate();
log(“原始开始:”,Start.toISOString())
log(“原始完成:”,Finish.toISOString())
log(“新开始:”,newStart.toISOString())

console.log(“New Finish:,newFinish.toISOString())
实现这一点的一种方法是计算从开始到现在的总天数,并在开始和结束时都添加这么多天,例如

函数固定日期(开始、结束){
//当前UTC日的开始时间
现在设为new Date().setUTCHours(0,0,0,0);
//开始UTC日的开始
设s=新日期(开始)。setUTCHours(0,0,0,0);
//UTC总天数差
设diff=(现在-s)/8.64e7;
//添加到开始和结束
start.setUTCDate(start.getUTCDate()+diff);
finish.setUTCDate(finish.getUTCDate()+diff);
返回[开始,完成];
}
//例子
[[-2209139100000, -2209095900000],
[-2209095900000,-2209139100000].forEach(arr=>{
设s=新日期(arr[0]);
设f=新日期(arr[1]);
log('Start:'+s.tolocalString());
log('Finish:'+f.tolocalString());
console.log('Fixed');
设[sf,ff]=固定日期(s,f);
log('newstart:'+sf.toLocaleString());
log('newfinish:'+ff.tolocalString());

})
所以你只需要小时数?我需要一个完整的日期时间,因为我需要进行比较(即如果轮班已经结束)。例如,上述开始时间需要为2020年12月15日星期二06:15:00 GMT+0000(格林威治标准时间)然后返回的完成时间将是未来合适的时间。那么从12月30日到15日你是如何得到的呢?@Rojo,因为这是今天的日期?我相信1899年12月30日是微软的某个基准日期。很好,这看起来像是我可以处理的事情。@JonathanAdams我用我认为是一个简单的日期稍微改变了我的答案更好的方法这是值得赞赏的。夜班快过了,我想不起如何让它工作。例如,如果您使用times start=
-2209095900000
和finish=
-2209139100000
返回
start:2020-12-15T18:15:00.000Z finish:2020-12-15T06:15:00.000Z
其中finish应该是
2020-12-16T06:15:00.000Z
@JonathanAdams我的答案中的代码使用了夜班示例,它的工作原理如下:expected@JonathanAdams
2209139100000
1899-12-30T06:15:00.000Z
这是在您正式开始之前。考虑到你的初始数据,我会这么说