【问题标题】:Getting Moment JS to display time ago up to yesterday then start displaying a formatted date让 Moment JS 显示到昨天的时间,然后开始显示格式化的日期
【发布时间】:2018-02-21 14:03:30
【问题描述】:

免责声明:我对 javascript(和 angular)非常陌生。

我正在尝试让 momentjs 显示从现在到昨天的时间。 3天后,它将显示实际日期。

使用随机日期的示例(日期差异将始终为“今天”):

  • 2017 年 10 月 10 日下午 6:41(未来)
  • 明天下午 6:41
  • 今天下午 6:41
  • 昨天下午 6:41
  • 2017 年 10 月 10 日下午 6:41

不确定我应该提供哪些其他信息,但请询问是否有帮助。

【问题讨论】:

  • 您应该添加您已经尝试过的内容。但是,您可以检查日期是否是今天/昨天/明天,在这种情况下,只需执行 moment.format('string format')
  • @binariedMe 我试过搜索,但找不到任何想要做我正在做的事情的帖子。我目前正在使用标准格式{{n.created_at | moment : 'format' : 'M/D/YY [at] h:mm a'}},它将日期显示为“10/10/17 下午 6:41”,但不显示“今天”等。
  • 不,您必须检查给定的日期是否是今天/明天/昨天才能显示特定的字符串,并且在 moment.js 中根本不支持它。只需制作一个自定义管道并检查给定日期是否为 t/t/y
  • @binariedMe 为不受支持的功能创建自定义管道目前可能超出我的能力范围。不过,我感谢您的帮助。
  • 您可以改为创建一个函数 getDisplayDate ,您可以从前端调用它而不是使用管道,所以像这样:{{getDisplayDate(n.created_at)}} 并通过进行一些检查来实现逻辑

标签: javascript angularjs momentjs


【解决方案1】:

有几个函数可以帮助获得预期的输出。

  1. moment.format():你可以用它来格式化你想要的字符串。例如:moment.format("dd/MM/YY at hh:mm:ss")
  2. moment.isSame():判断日期是否与今天相同。
  3. moment.diff():确定日期之间的差异。

这是一个基于您期望输出的解决方案: https://jsfiddle.net/3ruv8aj3/

【讨论】:

  • 上面的小提琴是基于预期输出的粗略解决方案,可以进一步改进。
【解决方案2】:

我不确定到目前为止你对 moment 的了解程度,所以从一开始就有一种方法:

// get today's date and time
var now = moment();

// will hold our display string (we'll set this in a minute)
var displayValue = '';

// target date & time in string format (YYYY-MM-DD hh:mm)
// you can also use a JavaScript date object instead of a string
var dateString = '2017-10-10 06:41';

// create a moment wrapper for the past/future date
var targetDate = moment(dateString);

// how many total days difference between then and now?
// calling moment() with no args defaults to current date and time
// first argument to `diff` is the date to subtract
// second argument is the unit of time to measure in
var difference = now.diff(targetDate, 'days');

if (difference > 3 || difference < -3) {
    // if the date is more than three days in the past or more than three days into the future...
    displayValue = targetDate.format('MM-DD-YYYY') + ' at ' + targetDate.format('hh:mm');
} else {
    // otherwise...
    displayValue = targetDate.fromNow();
}

console.log(displayValue); // > "10-10-2017 at 06:41"

编辑:如果目标日期恰好是今天,并且您想显示“今天”而不是时刻的默认“15 小时前”,只需检查 0 的差异。

if (difference === 0) displayValue = 'Today at ' + targetDate.format('hh:mm');

编辑:为清楚起见,为“现在”创建了一个变量。

【讨论】:

  • 这里很漂亮,如果我的解释有误,我们深表歉意。看起来您正在设置我在上面给出的日期并显示与该日期的差异?日期将始终为“今天”,就像创建日期一样。
  • 你需要一个日期来核对,对吗?与过去或未来日期相关的事物?
  • 这一行检查当前日期:var difference = moment().diff(targetDate, 'days'); 所以,你今天想使用的任何地方,都可以使用moment()。还是我误解了这个问题?
  • 我可能解释不正确。将尝试解释使用 this 的上下文。用户将发布一个“便笺”,并在该便笺上当前显示发布日期。如果适用,我想将日期更改为“今天”和“昨天”以及发布时间。这将始终与现实世界的当前日期进行比较。抱歉,如果我混淆了您的代码或不清楚。
  • 这完成了确定任何两个日期是否相隔超过三天,否则显示一个时间前的字符串。在您想要一个值表示今天的任何时候使用moment(),并在您想要一个值表示另一个日期的任何时候使用moment(otherDateValue)
【解决方案3】:

感谢大家的意见。使用您的示例,我能够解决问题。不久之后,我找到了一种更好的方法来做我想做的事,我将在这里分享。

使用 momentJS 日历功能使这变得非常简单。这是我的过滤器,它完全符合我的要求,还有一些额外的功能。

//This filter will display today, tomorrow, yesterday then display the actual date as 'M/D/Y at h:mm a'.
//Default preposition is 'at', but any other can be passed in as the second parameter.
.filter('formatForTimeAgo', function () {
  return function timeTodayDateElse(date, preposition){
    preposition=preposition|| 'at'
    moment.lang('en', {
      'calendar' : {
        'lastDay'  : '[Yesterday] [\n][ '+preposition+' ] h:mm a',
        'sameDay'  : '[Today] [\n][ '+preposition+' ] h:mm a',
        'nextDay'  : '[Tomorrow] [\n][ '+preposition+' ] h:mm a',
        'lastWeek' : 'M/D/YY [\n]['+preposition+'] h:mm a',
        'nextWeek' : 'M/D/YY [\n]['+preposition+'] h:mm a',
        'sameElse' : 'M/D/YY [\n]['+preposition+'] h:mm a'
       }
    });
    return moment(date).calendar();
  }
})

{{yourDate | }} 格式化后会显示如下:Today at 10:17 pmYesterday at 10:17 pmTomorrow at 10:17 pm。一旦 +/- 2 天,它将显示为数字日期,例如9/13/17 at 10:17 pm

您可以插入带有第二个参数的自定义介词(默认为“at”)。 示例:{{yourDate | formatForTimeAgo : 'by'}} 会将“at”更改为“by”,因此您会得到 Today by 10:17 pmYesterday by 10:17 pm 等。

再次感谢您。这是一次很棒的学习经历。

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2017-03-22
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多