【问题标题】:Datepicker string日期选择器字符串
【发布时间】:2020-03-12 07:55:26
【问题描述】:

我已阅读文档并查看了一些有关更改日期格式的材料,但是如何使用表单中的字符串而不是 Date 对象?

我需要以特定格式将日期发送到我的支持表单。有没有我想念的设置,所以我可以获得所需格式的日期字符串,而不是 FormGroup 中的 Date 对象?

【问题讨论】:

  • 您能提供一些字符串日期格式和示例日期格式,您需要将其发送到您的后端吗?
  • @ArunkumarRamasamy 假设我需要DD.MM.YY
  • 可以在你的组件中使用日期管道吗?
  • @ArunkumarRamasamy 我需要更改表单值而不是可见文本。

标签: angular typescript datepicker angular-material


【解决方案1】:

进口:

import { FormControl } from '@angular/forms';
import * as moment from 'moment';

DatePicker 到后端:

// example current date or specific
const datePicker = new FormControl(new Date() || '1980-01-01T00:00:00+01:00');

// Send to back with your specific format
const dateBack: string = moment(datePicker.value).format('DD.MM.YY');

DatePicker 的后端:

// example date recept from backend
const dateBack: string = '2020-03-12T00:00:00+01:00';

// convert date for datePicker
const datePicker: = new FormControl(dateBack);

【讨论】:

    【解决方案2】:

    首先,您应该尝试与负责 API 的人员交谈 - 仅接受日期作为字符串而不是日期对象至少可以说是一种不好的做法。

    如果这不可能,我会说您最好的选择是尽可能晚地转换它,以免将可怕的逻辑埋在您的组件/服务逻辑中。使用HttpInterceptor 转换您传出请求中的所有数据。如果您想为每一个传出请求全局处理它,这个解决方案会很好。下面是一个示例拦截器(未经测试 - 写在我的脑海中):

    @Injectable({
      providedIn: 'root'
    })
    export class DateInterceptor implements HttpInterceptor {
    
      constructor() { }
    
      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        request = request.clone({
          body: this.dateToString(request.body)
        });
    
        return next.handle(request);
      }
    
      dateToString(object: any): string {
        if (object === null || object === undefined) {
          return object;
        }
    
        if (typeof object !== 'object') {
          return object;
        }
    
        for (const key of Object.keys(object)) {
          const value = object[key];
          if (value instanceof Date) {
            object[key] = this.formatDate(value);
          } else if (typeof value === 'object') {
            this.dateToString(value);
          }
        }
      }
    
      formatDate(date: Date): string {
        return date.toISOString();
      }
    }    this.dateToString(value);
          }
        }
      }
    
      formatDate(date: Date): string {
        return date.toISOString();
      }
    

    这也需要在您的模块中注册 - 请参阅链接文档。

    我认为请求正文的递归转换虽然在性能方面并不完美,但在他们修复 API 之前是可以接受的解决方案。

    如果您使用多个 API,您可以运行检查请求是否针对该特定 API,例如通过检查请求 url:

      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (request.url.toLocaleLowerCase().includes('some-terrible-api')) {
          request = request.clone({
            body: this.dateToString(request.body)
          });
        }
    
        return next.handle(request);
      }
    

    当然,如果您使用其他一些日期提供程序(例如时刻),您需要相应地调整您的代码,但想法保持不变。

    【讨论】:

      【解决方案3】:

      您可以使用 moment.js 将日期转换为您喜欢的任何格式。

      import * as moment from 'moment';
      
      moment(date).format("YYYY-MM-DD");
      

      使用它,您可以将日期转换为 YYYY-MM-DD 中提到的特定格式。

      【讨论】:

      • 这个你没提,下次再说你的应用大小。
      【解决方案4】:

      您可以在模块中导入日期管道。

      `import {DatePipe} from '@angular/common';
      .
      .
      .
      providers: [DatePipe]`
      

      然后在构造函数中导入日期管道。

      `import { DatePipe } from '@angular/common';
      .
      .
      constructor(private datePipe: DatePipe) {}
      
      ngOnInit() {
        var date = new Date();
        console.log(this.datePipe.transform(date,"DD.MM.YY"));
      }`
      

      参考:https://stackblitz.com/edit/angular-3zyx8d

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        相关资源
        最近更新 更多