【问题标题】:How to replicate a 'new Date()' format?如何复制“新日期()”格式?
【发布时间】:2017-10-13 09:19:46
【问题描述】:

我在用什么

  • Angular 材质日期选择器
  • Moment.js
  • Firestore

我在做什么

  • 当我创建一个新项目并将其添加到 Firestore 时,我使用 'new Date()' 添加一个日期

  • 这将创建以下格式的 Firestore:2017 年 10 月 13 日上午 9:00:04 UTC+1

  • 这正是我想要的

  • 材料日期选择器可以很好地读取并显示 13/10/2017

我想做的事

  • 如果我编辑项目并从材料日期选择器中选择一个新日期并点击更新,我想转换日期选择器值,当前是 18/12/2017 的字符串强>(例如...)

  • 在写回数据库之前,我希望该格式类似于 2017 年 12 月 18 日上午 9:00:04 UTC+1

问题

  • 我该怎么做?
  • 是moment.js转换吗?
  • 或者材料日期选择器是否有可以帮助我的选项?

Component.html

<mat-form-field>
  <input #newItemDate #picker matInput [matDatepicker]="picker" placeholder="Choose a date" (focus)="picker.open()" formControlName="item_date">
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>


<button (click)="dateTest(newItemDate.value)"> Test Date </button> 

Component.ts

显然,这里不多 :) - 但这是我需要转换日期的地方

  dateTest(newItemDate) {    

    // newItemDate = 13/10/2017  

    // I need October 13, 2017 at 9:00:04 AM UTC+1
   
  }

【问题讨论】:

  • 在 SO 上,您应该尝试自己编写代码。在 doing more research 之后,如果您遇到问题,您可以发布您尝试过的内容,并清楚地解释什么不起作用并提供一个 Minimal, Complete, and Verifiable example.
  • 感谢您的回复。我可以很容易地发布什么不起作用,因此我为什么在这里......但是它不会改变我的问题和我需要帮助的内容。
  • 您需要发布您尝试但不起作用的代码。还有一个最小的例子,不是全部。
  • 详细的日期表示是一个标准,但数据库 SQL 的 DATETIME 宁愿只由一个日期对象填充,而 SQL 将正式使用 '2017-12-18T17:30:00' 或变体

标签: angular angular-material angular-material2


【解决方案1】:

您可以使用内置的日期格式化功能:

 dateTest(newItemDate) {    

    var formatedDate = new Date(newItemDate);

    // UTC Date
    console.log(formatedDate.toUTCString());

    // ISO Date
    console.log(formatedDate.toISOString());

  }

链接到StackBlitz Demo

【讨论】:

  • 嗨,费萨尔。我的日期区域设置可能设置为英国或美国。在您的示例中,它是美国。在这种情况下,当我的设置为 UK 时,我收到以下错误:“UTC = Invalid Date”/“ISO = ERROR RangeError: Invalid time value”
  • 我用美国模式测试过,效果很好。我可以像魅力一样在 Firestore 上读写。我使用“dateAdapter.setLocale('en-gb');”的那一刻,它不起作用。
  • 查看更新的演示。我添加了将en-GB 格式化为en-US 格式的方法,然后继续进行日期转换。
  • 谢谢。绝对的巫师。另外,感谢@OArnarsson 抽出时间回复 :)
【解决方案2】:

您可以尝试从字符串中提取片刻并将其格式化:

// dateTest(newItemDate) {  

// This way you can make a moment right from the string :)
let newItemDate = moment('13/10/2017', 'DD/MM/YYYY').format("MMMM DD, YYYY H:MM:SS A Z");
console.log(newItemDate);

// }
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"&gt;&lt;/script&gt;

编辑:修复了 sn-p 中缺少的 moment.js 导入。

【讨论】:

  • 嘿@OArnarsson!感谢您的回复! :)。我的控制台显示:您输入的日期是:1456444800000。这可能是材料日期选择器的事情吗?
  • @MegaTron 我已经更新了sn-p,它还给你纪元时间吗?
  • 嘿伙计,谢谢!那看起来更近了。但是 moment 将错误记录到控制台:“moment.min.js:23 弃用警告:提供的值不是公认的 ISO 格式。moment 构造回退到 js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非 ISO 日期格式,并将在即将发布的主要版本中删除。有关详细信息,请参阅 momentjs.com/guides/#/warnings/js-date。"
  • @MegaTron 我又更新了,还会报错吗?
  • 是的,很遗憾。 :( 感谢您抽出宝贵的时间来查看。非常友好 =)
猜你喜欢
  • 2013-07-10
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多