我在日期选择器中选择日期 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 ,这是错误的。
答案 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);