日期是一天前

时间:2020-01-10 01:46:28

标签: angular datepicker timestamp

我在日期选择器中选择日期 1985年5月1日,并将function postCreate(){ // Image Array for (var i = 0; i < imgcount; i++) { imgArray[i] = new Image(); imgArray[i].src = 'images/posters/ps' + i + '.jpg'; } imgArray.reverse(); // Magic Section postDel(function(){ div = document.createElement('div'); for (var i = 0; i < (imgscreen - 1); i++){ // Image var elem = document.createElement("img"); console.log(elem); elem = imgArray[i + imggrow] //Text var posttxt = [ "type: " + genre[1] +"<br>title: vægge af beton<br>director: nicolai haugaard<br>role: sound designer & sound recordist", "type: webseries<br>title: flush<br>director: anna nørskov<br>role: sound designer", "type: shortfilm<br>title: clay<br>director: leonard rääf<br>role: sound designer", "type: feature film<br>title: en rapport om festen og gæsterne<br>director: søren peter langkjær<br>role: sound designer", "type: shortfilm<br>title: sigøjnerjagt<br>director: mikkel andreas smidt<br>role: rerecording mixer", "type: feature film<br>title: den tid på året<br>director: paprika steen<br>role: sound design doing internship at nordisk film", "type: feature film<br>title: ternet ninja<br>director: anders matthesen<br>role: sound design doing internship at nordisk film", "type: feature film<br>title: før frosten<br>director: michael noer<br>role: dialog edit doing internship at nordisk film", "type: feature film<br>title: far til fire i solen<br>director: Martin Miehe-Renard<br>role: sound design doing internship at nordisk film", "type: feature film<br>title: lykke-per<br>director: Bille August<br>role: sound design doing internship at nordisk film", "type: shortfilm<br>title: hvad hvis alle farver var blå<br>director: hannah elbke<br>role: sound designer", "type: shortfilm<br>title: why woman<br>director: sebastian bjerregaard<br>role: sound designer", "type: shortfilm<br>title: soler sig<br>director: sigurd bleken<br>role: sound designer", "type: shortfilm<br>title: slushice<br>director: søren grinderslev<br>role: sound designer", "type: shortfilm<br>title: kong vincent<br>director: mikkel smidt<br>role: sound designer & sound recordist", "type: shortfilm<br>title: guldalder<br>director: mikkel smidt<br>role: sound designer" ] //Create Div Posts if(elem.width == 0){ return null; } else { imgcurrent = i + imggrow + 1; // div clone = div.cloneNode(); clone.setAttribute("class", "poster-img"); clone.setAttribute("id", "postnr" + i) posterList.appendChild(clone); // <p> element var elemtxt = document.createElement('p'); elemtxt.innerHTML = posttxt[i + imggrow]; elemtxt.setAttribute("class", "postinfo"); elemId = document.getElementById("postnr" + i); elemId.appendChild(elem); elemId.appendChild(elemtxt); // Animation elem.animate([ { opacity: 0 }, { opacity: 1 } ], { duration: 1000, } ); } } }); } //-------- Delete Previous Divs ---------------// function postDel(_callback){ posterList.querySelectorAll('*').forEach(n => n.remove()); _callback(); } 发送到服务器,以便可以将其存储在数据库中。

dateOfBirth.value

每当刷新页面时,所选日期仍然应该可见。

我的问题是,我选择了日期 05/01/1985 ,但是我的日期选择器显示了日期 4/30/1985 。为什么?

<mat-form-field>
  <label><input #dateOfBirth matInput (blur)="_update('personal', 'dateOfBirth', dateOfBirth.value)" (click)="picker.open()" [matDatepicker]="picker" placeholder="Choose a date" formControlName="dateOfBirth" autocomplete="off" [max]="maxDate" [min]="minDate"></label>
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker touchUi #picker startView="multi-year"></mat-datepicker>
  <mat-error *ngIf="profileFormGroup.get('dateOfBirth').errors">Date is not valid</mat-error>
</mat-form-field>

这是我将时间戳存储在数据库中的方式:

private static _formatDate(timestamp: number): string {
  console.log(timestamp); // Returns 483746400000
  const date = new Date(+timestamp);
  console.log(date.getDay()); // Returns 3 but it should be 1
  return date.toISOString().substring(0, 10);
}

ngOnInit() {
  this.profileService.getEntities().subscribe(data => {
  this.profileFormGroup.get('dateOfBirth').patchValue(ProfileComponent._formatDate(data.dateOfBirth));
  });
}

我还检查了其他示例,例如this one on Stackblitz。如果选择日期 01/05/2020 ,则输出将为 2020-04-30T22:00:00.000Z ,这是错误的。

1 个答案:

答案 0 :(得分:1)

根据您的语言环境,五月属于夏令时。

如果保留时区,则设置日期为05/01/1985的日期应为1985-05-01T00:00.000+1:00

正在发生的情况是您正在使用UTC提取日期。这样会将日期转换为+0:00,从而带您进入1985-04-30T23:00.000+0.00的前一天。

如果您尝试使用Stackblitz,则问题已得到证明-在3月底之前选择一个日期,在10月底之后选择一个日期-这些日期可以正常使用,因为它们不是夏令时。

您的格式日期功能使用.toISOString()拉出日期。根据Mozzila(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)的说法,这将始终返回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);
相关问题