Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Angular 日期是一天前_Angular_Datepicker_Timestamp - Fatal编程技术网

Angular 日期是一天前

Angular 日期是一天前,angular,datepicker,timestamp,Angular,Datepicker,Timestamp,我在datepicker中选择日期1985年5月1日,并将dateOfBirth.value发送到我的服务器,以便将其存储在数据库中 日期无效 每当我刷新页面时,所选日期仍应可见 我的问题是,我选择了1985年1月5日,但我的日期选择器显示的是1985年4月30日。为什么? 私有静态_formatDatetimestamp:number:string{ console.logtimestamp;//返回483746400000 const date=新日期+时间戳; console.logdat

我在datepicker中选择日期1985年5月1日,并将dateOfBirth.value发送到我的服务器,以便将其存储在数据库中

日期无效 每当我刷新页面时,所选日期仍应可见

我的问题是,我选择了1985年1月5日,但我的日期选择器显示的是1985年4月30日。为什么?

私有静态_formatDatetimestamp:number:string{ console.logtimestamp;//返回483746400000 const date=新日期+时间戳; console.logdate.getDay;//返回3,但应该是1 return date.toISOString.substring0,10; } 恩戈尼特{ this.profileService.getEntities.subscribedata=>{ this.profileFormGroup.get'dateOfBirth'。patchValueProfileComponent.\u formatDatedata.dateOfBirth; }; } 这是我在数据库中存储时间戳的方式:

private\u updatetableName:string,columnName:string,theValue:any{ //设置dateOfBirth的正确值 console.logtheValue;//返回1985年1月5日 如果columnName=='dateOfBirth'{ const splitDate=value.split'/; const newDate=`${splitDate[2]}/${splitDate[0]}/${splitDate[1]}`; 该值=new date newdate.getTime; console.logtheValue;//返回483746400000 } 常量json={ 表:表名, column:columnName, 值:theValue }; this.profileService.updatejson.subscriberesult=>{ console.logresult; }; }
我还检查了其他示例,如。如果选择日期2020年5月1日,则输出将为2020-04-30T22:00:00.000Z,这是错误的。

根据您所在的地区,5月份属于夏令时

如果保留时区,将日期设置为1985年1月5日应为1985-05-01T00:00.000+1:00

看起来您正在提取UTC中的日期。这会将日期转换为+0:00,从而将您带入1985-04-30T23:00.000+0.00的前一天

如果你尝试Stackblitz,问题就被证明了——选择3月底之前和10月底之后的日期——这些日期工作正常,因为它们不是夏令时

格式化日期函数使用.toISOString提取日期。根据Mozzila的说法,这将始终返回UTC时间,您的日期将延迟一个小时,因为这是在午夜,它将落在前一天

由于您只关心日期,并且日期选择器可能会以每种方式抵消多达12小时的时间,因此我们可以对此进行检查

默认日期始终为午夜,因此UTC之前的任何日期都可以,因为它将保持不变。UTC之后的任何时间都将回到12小时,直到第二天

在代码中,检查时区偏移将告诉我们是否落后。如果是这样,那么我们希望向datetime对象添加小时数,这样当我们使用toISOString时,我们仍然可以选择日期

因此,功能应如下所示:

const date = new Date(+timestamp);
const offset = date.getTimezoneOffset();
if (offset < 0) {
    date.setHours(12,0,0);
}
return date.toISOString().substring(0,10);

你为什么要除以1000?如果将该结果保存为整数,则稍后将其乘以1000将无法恢复原始值;几分钟就要过去了,这会把日期移到前一天。你为什么要把时间缩短1000分钟?你能提供Stallbliz链接吗?@ConnorsFan好的,现在我不再除以它,但我仍然将它乘以1000。我还是选错了日期。如果我删除*1000,我会得到错误范围错误:无效时间value@piyushjain我已经更新了我的问题,你可以看到stackblitz的链接。这不是我自己的代码,但问题可能是相同的。您可以尝试+timestamp,而不是timestamp*1000,以避免异常,同时保持相同的日期/时间值。谢谢您的回答。我试过了,但现在结果是1985-04-01。更新了答案。旧代码依赖于不同的当前时区。正确计算是件很糟糕的事情。这很有效。正是我想要的。非常感谢你!!