You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Material2日期选择器:去除时间信息将日期转为时间戳

回答

1. 无需Moment.js:原生JS就能完成ISO字符串到时间戳的转换

针对生日场景(无需时区信息,只关注日期本身),可以用以下两种原生方式处理:

方式一:直接转换ISO字符串为UTC时间戳

如果接受ISO字符串对应的UTC时间戳,直接用Date对象的getTime()方法即可:

const isoString = "2018-05-01T22:00:00.000Z";
const timestamp = new Date(isoString).getTime();
// 输出:1525183200000(对应UTC时间2018-05-01 22:00:00)

方式二:生成本地时区的生日日期时间戳(更贴合生日场景)

如果希望时间戳对应本地时区中该日期的0点(毕竟生日按本地日期计算更合理),可以先提取ISO字符串的日期部分,再构造本地日期:

const isoString = "2018-05-01T22:00:00.000Z";
const datePart = isoString.split('T')[0]; // 提取"2018-05-01"
const localBirthdayDate = new Date(datePart);
const localTimestamp = localBirthdayDate.getTime();
// 输出:本地时区2018-05-01 00:00:00对应的时间戳

2. Material2日期选择器可以直接获取时间戳(不必先转ISO字符串)

Material DatePicker默认返回的是Date对象,而非ISO字符串——你拿到ISO字符串大概率是表单控件的默认值转换导致的。直接获取选中的Date对象,再调用getTime()就能得到时间戳,这是最简洁的方式:

示例代码(Angular组件中)

import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'birthday-picker-example',
  template: `
    <mat-form-field appearance="fill">
      <mat-label>选择生日</mat-label>
      <input matInput [matDatepicker]="picker" [formControl]="birthdayControl">
      <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
      <mat-datepicker #picker></mat-datepicker>
    </mat-form-field>
    <p>生日时间戳:{{ getBirthdayTimestamp() }}</p>
  `,
})
export class BirthdayPickerExample {
  birthdayControl = new FormControl();

  getBirthdayTimestamp() {
    const selectedDate = this.birthdayControl.value;
    if (selectedDate instanceof Date) {
      // 生成本地时区生日当天0点的时间戳
      return new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate()).getTime();
    }
    return null;
  }
}

如果确实需要让DatePicker直接返回时间戳,也可以通过自定义DateAdapter或表单控件值转换器实现,但上述直接使用Date对象的方式已经足够简便,无需额外配置。

内容的提问来源于stack exchange,提问作者Budi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:41