Angular 角度材质日期选择器:日期变为选定日期前一天
我正在使用最新的Angular 4和Angular-Material2-2.0.0-beta7。这是使用Angular 角度材质日期选择器:日期变为选定日期前一天,angular,angular-material2,Angular,Angular Material2,我正在使用最新的Angular 4和Angular-Material2-2.0.0-beta7。这是使用MdDatePicker的我的模板: 在app.module中,提供程序如下: 和成员。生日是日期类型。 但是当JSON.stringify(member.birth)时,它就变成了所选日期的前一天。例如: 从日期选择器中选择2017-4-1,字符串化结果为2017-03-31T13:00:00.000Z 提出了同样的问题,但我不确定如何将moment.js应用于代码。当我们在日期选择器
MdDatePicker
的我的模板:
在app.module中,提供程序如下:
和成员。生日
是日期
类型。
但是当JSON.stringify(member.birth)
时,它就变成了所选日期的前一天。例如:
从日期选择器中选择2017-4-1
,字符串化结果为2017-03-31T13:00:00.000Z
提出了同样的问题,但我不确定如何将
moment.js
应用于代码。当我们在日期选择器中选择日期时,选择以GMT(根据格林威治时区)时间存储和操作,但以格式化的表示形式显示给用户,同时考虑到用户的当前时区。所以存储和显示的日期是不同的(除了时区+0内的用户,比如格林威治)
当字符串化JS Date对象时,我们得到了清晰的格林威治时区时间,我们可以在。您可能希望看到的是使用当前时区格式化的时间表示。请看我的示例中的差异
//获取当前时间
让日期=新日期();
log('NATIVE JS DATE TIME',DATE.toString());
log('stringized TIME',JSON.stringify(date));
log('FORMATTED TIME',`${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`)代码>我通过创建一个自定义日期适配器(它继承了本机日期适配器)并重写create date方法来删除时区偏移量,从而解决了这个问题
@Injectable({ providedIn: 'root' })
export class CustomDateAdapterService extends NativeDateAdapter {
public createDate(year: number, month: number, date: number): Date {
const localDate = super.createDate(year, month, date);
const offset = localDate.getTimezoneOffset() * 60000;
return new Date(localDate.getTime() - offset); // utcDate
}
}
您可以查看一下使用以下转换,它将解决您的问题
date = new Date(this.moment(date).utcOffset('+0000').format('YYYY-MM-DD HH:MM'))
有一件事我们需要了解日期是如何工作的。让我看一下如何创建日期对象的示例
new Date('2020-08-22') // 22 aug 2020(your expect result)
上面日期的输出取决于您的时区,当您传递它认为是GMT的日期时。它会根据您的时区添加偏移量。假设您处于+0500,它将打印
2020年8月22日星期六05:00:00GMT+0500
它会使你的约会时间增加5小时
如果你在-0500,那么它会
2020年8月21日星期五19:00:00GMT-0500
如果您想要日期,请始终提供您通过的日期,而不添加偏移量
new Date(2020,07,22)
2020年8月22日星期六00:00:00GMT+0500
它不会向日期对象添加小时(偏移)
new Date('2020-08-22') // 22 aug 2020(your expect result)
我只是通过第二种方法解决了这个问题,它对我很有效。我使用PHP和SQL,我以默认格式存储日期,如2021-04-12 00:00:00
。
我想存储用户提供的实际值,所以我不必费心转换时区。这是无关紧要的,在写文章的那天,我只想要一个好的日期表示
这就是我存储给定日期的本地时间的原因:
let phpDate = `${selectedDate.getFullYear()}-${selectedDate.getMonth()+1}-${selectedDate.getDate()} 00:00:00`;
// Notice that we have to add 1 to the zero-based JS month
解析存储的日期:
this.date = new Date(
Number(d.substr(0, 4)),
Number(d.substr(5, 2)) -1, // we need to subtract 1 because JS mont is 0-based
Number(d.substr(8, 2)));
})
我希望这将有助于。。。只需获取formgroup的值并存储在const中,然后在使用datePipe后重新分配formcontrol的值
import { DatePipe } from '@angular/common';
只需在component.ts文件中使用Datepipe,并添加组件提供程序和构造函数
private datePipe: DatePipe,
providers: [DatePipe]
在submit函数中
const commonForm = {
...this.pollAdd.value,
};
commonForm.endDate=this.datePipe.transform(this.pollAdd.value.endDate, 'yyyy-MM-dd');
commonForm.startDate=this.datePipe.transform(this.pollAdd.value.startDate, 'yyyy-MM-dd');
所选日期的格式是什么?2017年4月1日的DD-MM-YYYY是您的时区-11:00吗?您可以创建一个plunkr来reproduce@RobG我的时区是GMT+1000(AEST),谢谢@Andrey!是的,现在是格林威治时间,而不是一个资料采集器的错误。当我使用moment格式化Datepicker返回的日期时,它是正确的日期。好的,记住,我的日期在数据库中正确存储(使用格式YYYY-MM-DD),但是当我从后端获取并在mat Datepicker中显示它时(使用mat_date_LOCALE='pt',使用格式DD-MM-YYYY),它显示1天前。我应该怎么处理它呢?尝试将日期存储为时间戳整数值,而不是字符串日期表示形式(这可能已经受到时区的影响)。存储的日期值应以UTC为单位。显示时,日历将接受UTC时间和转换/格式,并考虑您当前的时区