让Moment JS在前一天显示到昨天,然后开始显示格式化的日期

问题描述:

声明:我对JavaScript(和angular)非常陌生。让Moment JS在前一天显示到昨天,然后开始显示格式化的日期

我试图让momentjs显示从现在到昨天的时间。一旦过了3天,它会显示实际的日期。

例使用随机日期(日期差异将永远是 “今天”):

  • 17年10月10日在下午6时41分(未来)
  • 明天下午6时41
  • 今天,在下午6时41
  • 昨天下午6点41
  • 17年10月10日在下午6时41

不知道世界卫生大会t我应该提供的其他信息,但请询问是否有帮助。

+1

你应该添加你已经尝试过的东西。然而,你可以检查日期是否是今天/昨天/明天,在这种情况下只是做moment.format('字符串格式') – binariedMe

+0

@binariedMe我试过搜索,虽然找不到任何职位寻找做我是这样做。我目前使用标准格式'{{n.created_at | moment:'format':'M/D/YY [at] h:mm a'}}'将日期显示为“10/10/17 at 6:41 pm”,但不显示“Today”等。 – Camitose

+0

不,你将不得不检查给定的日期是今天/明天/昨天,以显示特定的字符串,并且它不会在moment.js中被支持。只需制作一个自定义管道并检查给定日期是否为t/t/y – binariedMe

谢谢大家的意见。使用你的例子,我能够解决这个问题。不久之后,我发现了一个更好的方式来做我想要的,我将在这里分享。

使用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 pm,或Tomorrow at 10:17 pm。一旦+/- 2天,它将显示为数字日期,例如9/13/17 at 10:17 pm

您可以将自定义的介词(默认为“AT”)与第二个参数。 例子:{{yourDate | formatForTimeAgo : 'by'}}将改变“在”到“用”等你拿Today by 10:17 pmYesterday by 10:17 pm

再次,谢谢。这是一个很好的学习经历。

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

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

下面是根据你所期望的输出是一个解决方案: https://jsfiddle.net/3ruv8aj3/

+0

上面的提琴是一个粗糙的基于预期产出的解决方案可以进一步改进。 –

我不知道你有多少与时刻熟悉为止,所以这里的做到这一点的一种方式,从开头:

// 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'); 

编辑:为清晰起见,为'现在'创建了一个变量。

+0

这里很绿很抱歉,如果我解释不正确。看起来你正在设定我上面给出的日期,并显示差异与那个日期?日期将始终为“今天”,如创建日期那样。 – Camitose

+0

你需要一个日期来检查,但是,对吗?与它有关的过去或未来日期的东西? – sheminusminus

+0

这一行检查当前日期:'var difference = moment()。diff(targetDate,'days');'所以,如果你想在今天的任何地方使用,你可以使用'moment()'。或者我误解了这个问题? – sheminusminus