Material Angular 6 DatePicker 正在解析我的日期前 1 天

Posted

技术标签:

【中文标题】Material Angular 6 DatePicker 正在解析我的日期前 1 天【英文标题】:Material Angular 6 DatePicker is parsing my date 1 day before 【发布时间】:2018-11-17 12:30:39 【问题描述】:

Material Angular DatePicker 的当前版本发生了一些非常奇怪的事情,在我将它从 A5 更新到 A6 后,它开始在 1 天前解析我的日期,示例在这里:https://stackblitz.com/edit/angular6-datepicker-parsing-wrong-date

我正在使用原始文档示例,将语言稍微更改为我自己的语言,并将自定义日期值应用到 ngModel 以便它可以解析。

但是你可以在这里查看代码:

import Component from '@angular/core';
import MAT_MOMENT_DATE_FORMATS, MomentDateAdapter from '@angular/material-moment-adapter';
import DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE from '@angular/material/core';

@Component(
  selector: 'datepicker-locale-example',
  templateUrl: 'datepicker-locale-example.html',
  styleUrls: ['datepicker-locale-example.css'],
  providers: [
    provide: MAT_DATE_LOCALE, useValue: 'pt', //my change from the original documentation example
    provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE],
    provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS,
  ],
)
export class DatepickerLocaleExample 
  constructor(private adapter: DateAdapter<any>) 

  private someDate = '2018-01-31'; //my change from the original documentation example

  french() 
    this.adapter.setLocale('fr');
  

HTML:

<mat-form-field>
  <input matInput [matDatepicker]="myDatePicker" placeholder="Different locale" [(ngModel)]="someDate"> <!-- my change from the original documentation example -->
  <mat-datepicker-toggle matSuffix [for]="myDatePicker"></mat-datepicker-toggle>
  <mat-datepicker #myDatePicker></mat-datepicker>
  <mat-hint>Actual Date: someDate</mat-hint>
</mat-form-field>

<button mat-button (click)="french()">Dynamically switch to French</button>

有人知道怎么解决吗?

【问题讨论】:

您是否处于负偏移时区? 我在这里是 UTC+1 / UTC+2,我没有任何问题,所以我猜这与本地显示日期、时区有关。 i.stack.imgur.com/9FPfn.png @Pac0 我在 -3h,我的代码有误,请更新您的屏幕并告诉我是否可以。 这是我启动应用程序时看到的内容:i.stack.imgur.com/PDwDv.png。当我单击“切换到法语”时,没有任何变化。如果我更改日期,那么我有.this(消息已更改):i.stack.imgur.com/lIjwT.png。单击切换按钮也不会改变任何东西。但是,日期没有问题(在我这边) 也测试了 stackblitz,我这边没问题。 【参考方案1】:

所以,经过一些研究,我发现这是一个时区问题。为了临时修复它,我必须将 T00:00:00 连接到来自后端的日期末尾,格式为 yyyy/MM/dd。 p>

如果可能的话,最好的选择是到后端将格式更改为 yyyy/MM/ddTHH:mm:ss

否则,当您必须在 Angular 6 Material DatePicker 中使用格式 yyyy/MM/dd 时,有 2 个选项可以解决问题:有好有坏。

不好的(可能只是暂时的)是做我所做的,在 DatePicker 解析它之前将 T00:00:00 连接到日期的末尾。 好处是实际获取日期字符串,将其转换为日期,将时区转换为 GMT,然后让 DatePicker 对其进行解析。

我希望我能像我一样帮助那些绝望的人。

【讨论】:

在我的情况下,我在后端使用 java.time.LocalDate 而不是 java.time.LocalDateTime。更改日期和解决问题的类型【参考方案2】:

对于只希望他们的日期为 UTC 日期并且通过 DatePicker 使用 JS Date 对象卡住的任何人,您只需向 @NgModule 提供程序添加一个适配器选项:

@NgModule(
  imports: [MatDatepickerModule, MatMomentDateModule],
  providers: [
     provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue:  useUtc: true  
  ]
)

您需要将@angular/material-moment-adapter 添加到您的package.json 并导入模块/选项对象:

import MAT_MOMENT_DATE_ADAPTER_OPTIONS, MatMomentDateModule from '@angular/material-moment-adapter';

一旦完成,任何 DatePicker 都将提供 UTC 日期,并且考虑到没有机会使用 DatePicker 选择时间组件,这似乎是合适的。

从Material DatePicker info中提取。

【讨论】:

【参考方案3】:

你可以做一个解析函数,像这样:

let newDate= new Date(oldDate);
newDate.setMinutes(newDate.getMinutes() + newDate.getTimezoneOffset());

return newDate;

【讨论】:

不错的主意。

以上是关于Material Angular 6 DatePicker 正在解析我的日期前 1 天的主要内容,如果未能解决你的问题,请参考以下文章

Material Angular 6 DatePicker 正在解析我的日期前 1 天

如何在 Angular 6 中使用 Material 将 mat-chip 绑定到 ngmodel

@angular/material/index.d.ts' 不是模块

如何过滤mat-tree组件Angular Material 6.0.1

怎么评价Angular推出的Material,相比Polymer如何

Angular Material 11.0.3 + Tailwind CSS 不工作