【问题标题】:Comparing Times Using Moment.js使用 Moment.js 比较时间
【发布时间】:2012-10-27 04:45:39
【问题描述】:

我一直在玩Moment.js,但遇到了一个问题。我一直在尝试确定给定的日期是过去还是将来。日期存储为Unix timestamps。因此,当我将未来日期与当前日期进行比较时,它工作正常,但它不会触发过去的日期。示例代码如下和fiddle is here

var pastUnixTime = '1348812970'; //some time in the past
var futureUnixTime = '1352350231';

if (moment.unix(futureUnixTime).format('DD MM YYYY') > moment().format('DD MM YYYY')) {
    console.log('yay');
}


if (moment.unix(pastUnixTime).format('DD MM YYYY') < moment().format('DD MM YYYY')) {
    console.log('yay 2');
}
​

上面的代码记录yay不是yay 2。谁能向我解释为什么它不记录yay 2

【问题讨论】:

    标签: javascript date momentjs


    【解决方案1】:

    您实际上根本不需要为此使用.format()

    首先,时间戳应该是数字,而不是字符串(例如,var pastUnixTime = 1348812970;),其次,您可以直接比较它们:

    > pastUnixTime = 1348812970;
    > pastUnixTime < moment().unix()
    true
    > pastUnixTime > moment().unix() 
    false
    

    现在,您的代码失败的原因是,当您比较 DD MM YYYY 字符串时,它们是按字典顺序比较的……而日子是首先!所以字符串"01 01 2000" 总是“小于”"31 12 1900"。如果您想要比较字符串,可以使用YYYY MM DD 格式——这样,"2000 01 01" 将正确地“大于”"1900 12 31"。但没有理由这样做 - 时间戳更直接。

    最后,请注意:您实际上并不需要使用 .unix() - moment() 的实例将进行比较:

    > past = moment().subtract("days", 1)
    > now = moment()
    > past < now
    true
    > past > now
    false
    

    【讨论】:

    • 是的,但我格式化它们的唯一原因是我想知道时间戳是否早于当天或更晚。时间戳可能与 moment() 给出的当前时间戳不同,但仍然在同一天,这并不表明它是过去的。编辑:我希望我不会太困惑:$
    • 太棒了 - 谢谢 - 问题在于字典比较。
    • 啊,抱歉,我没注意到。有两种方法可以解决这个问题:比较字符串(见我的评论)使用.startOf("day"):moment.unix(…).startOf("day") &lt; moment().startOf("day")。 IMO 后者更清晰,因为它使您的意图非常明显。
    • 没问题 :) 另外,请参阅我上次编辑的关于甚至不需要使用 .unix() 的内容。
    • @hereandnow78 moment() 返回的对象实现了一个 valueOf() 方法,JavaScript 在进行比较时使用该方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多