让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我应该提供的其他信息,但请询问是否有帮助。
谢谢大家的意见。使用你的例子,我能够解决这个问题。不久之后,我发现了一个更好的方式来做我想要的,我将在这里分享。
使用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 pm
,Yesterday 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 pm
,Yesterday by 10:17 pm
等
再次,谢谢。这是一个很好的学习经历。
有几个函数可以帮助获得预期的输出。
-
moment.format()
:你可以用它来像你想要的那样格式化字符串。例如:moment.format("dd/MM/YY at hh:mm:ss")
-
moment.isSame()
:确定日期是否与今天相同。 -
moment.diff()
:确定日期之间的差异。
下面是根据你所期望的输出是一个解决方案: https://jsfiddle.net/3ruv8aj3/
上面的提琴是一个粗糙的基于预期产出的解决方案可以进一步改进。 –
我不知道你有多少与时刻熟悉为止,所以这里的做到这一点的一种方式,从开头:
// 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');
编辑:为清晰起见,为'现在'创建了一个变量。
这里很绿很抱歉,如果我解释不正确。看起来你正在设定我上面给出的日期,并显示差异与那个日期?日期将始终为“今天”,如创建日期那样。 – Camitose
你需要一个日期来检查,但是,对吗?与它有关的过去或未来日期的东西? – sheminusminus
这一行检查当前日期:'var difference = moment()。diff(targetDate,'days');'所以,如果你想在今天的任何地方使用,你可以使用'moment()'。或者我误解了这个问题? – sheminusminus
你应该添加你已经尝试过的东西。然而,你可以检查日期是否是今天/昨天/明天,在这种情况下只是做moment.format('字符串格式') – binariedMe
@binariedMe我试过搜索,虽然找不到任何职位寻找做我是这样做。我目前使用标准格式'{{n.created_at | moment:'format':'M/D/YY [at] h:mm a'}}'将日期显示为“10/10/17 at 6:41 pm”,但不显示“Today”等。 – Camitose
不,你将不得不检查给定的日期是今天/明天/昨天,以显示特定的字符串,并且它不会在moment.js中被支持。只需制作一个自定义管道并检查给定日期是否为t/t/y – binariedMe