Angular 角度材质日期选择器:日期变为选定日期前一天

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应用于代码。当我们在日期选择器

我正在使用最新的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
应用于代码。

当我们在日期选择器中选择日期时,选择以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时间和转换/格式,并考虑您当前的时区