new Date(epoch)在Ember组件内返回无效日期

yyhrrdl8  于 2022-10-20  发布在  其他
关注(0)|答案(1)|浏览(199)

我在Ember应用程序中使用了一个date-filter组件,它只在初始渲染时工作,而不在页面重新加载时工作,甚至在我保存文件时(这会触发应用程序进行实时更新)。
在我的应用程序的主模板中,我像这样呈现日期过滤器,并将其传递给unix时间戳

{{date-filter unixepoch=item.date}}

然后,在components/date-filter.js中,我使用名为timeConverter的计算属性将unix历元更改为根据用户选择的语言格式化的时间字符串,然后在我的templates/components/date-filter.hbs文件中执行{{timeConverter}}以显示结果

timeConverter: function(){
    //step 1: get the epoch I passed in to the component
    var epoch = this.get('unixepoch');
    //step 2: create a human readable date string such as `Jun 29, 2015, 12:36PM`
    var datestring = new Date(epoch)

    //do language formatting --code omitted as the problem is with step2

}

如果刷新页面或甚至保存文件,则step 2失败(返回invalid date)。它总是在第一次调用此组件时返回正确的日期字符串。即使我在父组件中执行new Date(epoch),并尝试将结果传递给该组件(以进行外语格式化),我也会遇到同样的问题。
问题:我如何才能弄清楚新Date(epoch)内部发生了什么,或者这是否是与组件相关的问题?

dgsult0t

dgsult0t1#

我怀疑你的epoch值是一个字符串(所有数字)。如果是,那么

var datestring = new Date(+epoch);
// Note ------------------^

…将通过将其转换为数字来解决问题(+只是一种方法,此答案列出了您的选项及其优缺点)。请注意,JavaScript使用新的“自大纪元以来的毫秒数”,而不是旧的(原始的)“自大时代以来的秒数”。因此,如果这样做开始给你日期,但它们比你预期的要早得多,你可能希望epoch * 1000将秒数转换为毫秒数。
如果它是一个不是所有数字的字符串,那么它根本不是一个历元值。规范要求new Date理解的唯一字符串值是此处规范中描述的值(尽管所有主要的JavaScript引擎也理解使用美国日期顺序中的/[而不是-]的未记录格式[不考虑区域设置]:mm/dd/yyyy-不要使用它,使用标准格式)。

相关问题