明天,今天和昨天的 MomentJS

我喜欢 moment().fromNow()的功能,但是当日期接近的时候,它太精确了。我不希望它显示“在3小时内”,但“今天”-所以基本上与“每日”的精度。

我尝试使用 moment().calendar()函数,它不格式化,如果日期差异超过1天

260384 次浏览

在 Moment.js 中,从()方法具有您所期望的日常精度:

var today = new Date();
var tomorrow = new Date();
var yesterday = new Date();
tomorrow.setDate(today.getDate()+1);
yesterday.setDate(today.getDate()-1);


moment(today).from(moment(yesterday)); // "in a day"
moment(today).from(moment(tomorrow)); // "a day ago"


moment(yesterday).from(moment(tomorrow)); // "2 days ago"
moment(tomorrow).from(moment(yesterday)); // "in 2 days"

您可以使用 moment.updateLocale自定义 .fromNow.calendar方法显示日期的方式。下面的代码将改变 .calendar根据问题显示的方式:

moment.updateLocale('en', {
calendar : {
lastDay : '[Yesterday]',
sameDay : '[Today]',
nextDay : '[Tomorrow]',
lastWeek : '[Last] dddd',
nextWeek : '[Next] dddd',
sameElse : 'L'
}
});

基于这个问题,似乎 .calendar方法更合适—— .fromNow希望有一个过去/现在的前缀/后缀,但是如果您想了解更多信息,您可以阅读 http://momentjs.com/docs/#/customization/relative-time/上的文档。

为了只在一个地方使用它,而不是覆盖区域设置,在定义 moment.updateLocale时传递您选择的字符串作为第一个参数,然后使用该区域设置调用日历方法(例如,。moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ))

编辑: Moment ^ 2.12.0现在有了 updateLocale方法。updateLocalelocale在功能上似乎是相同的,而且 locale还没有被废弃,但是更新了答案以使用更新的方法。

这就是我最后做的事

var dateText = moment(someDate).from(new Date());
var startOfToday = moment().startOf('day');
var startOfDate = moment(someDate).startOf('day');
var daysDiff = startOfDate.diff(startOfToday, 'days');
var days = {
'0': 'today',
'-1': 'yesterday',
'1': 'tomorrow'
};


if (Math.abs(daysDiff) <= 1) {
dateText = days[daysDiff];
}

您也可以这样做来获取今天、明天和昨天的日期

let today     = moment();


let tomorrow  = moment().add(1,'days');


let yesterday = moment().add(-1, 'days');

我有类似的解决方案,但是允许使用 locale:

    let date = moment(someDate);
if (moment().diff(date, 'days') >= 2) {
return date.fromNow(); // '2 days ago' etc.
}
return date.calendar().split(' ')[0]; // 'Yesterday', 'Today', 'Tomorrow'

我使用 add()endOf()的组合与瞬间

//...
const today = moment().endOf('day')
const tomorrow = moment().add(1, 'day').endOf('day')


if (date < today) return 'today'
if (date < tomorrow) return 'tomorrow'
return 'later'
//...

[ EDIT 2022-01-04]我建议您使用 now dayjs,它具有与 moment 相同的 API,并且是轻量级的;)

从2.10.5时刻起,支持为每次调用指定日历输出格式 有关更详细的文档,请查看 瞬间-日历

**Moment 2.10.5**
moment().calendar(null, {
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
lastDay: '[Yesterday]',
lastWeek: '[Last] dddd',
sameElse: 'DD/MM/YYYY'
});

从2.14.0日历也可以采取回调返回值。

**Moment 2.14.0**
moment().calendar(null, {
sameDay: function (now) {
if (this.isBefore(now)) {
return '[Will Happen Today]';
} else {
return '[Happened Today]';
}
/* ... */
}
});

要求:

  • 当日期更远时,使用标准的 moment().fromNow()功能。
  • 当日期接近时,显示 "today""yesterday""tomorrow"等。

解决方案:

// call this function, passing-in your date
function dateToFromNowDaily( myDate ) {


// get from-now for this date
var fromNow = moment( myDate ).fromNow();


// ensure the date is displayed with today and yesterday
return moment( myDate ).calendar( null, {
// when the date is closer, specify custom values
lastWeek: '[Last] dddd',
lastDay:  '[Yesterday]',
sameDay:  '[Today]',
nextDay:  '[Tomorrow]',
nextWeek: 'dddd',
// when the date is further away, use from-now functionality
sameElse: function () {
return "[" + fromNow + "]";
}
});
}

注意: 从2.14.0版本开始,日历函数的 format 参数可以是一个回调函数,参见 http://momentjs.com/docs/#/displaying/calendar-time/

你可以用这个:


const today     = moment();


const tomorrow  = moment().add(1, 'days');


const yesterday = moment().subtract(1, 'days');


const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]

你可以用。Add ()和。减去()方法得到昨天和明天的日期。然后使用格式化方法只获取日期。格式(“ D/M/Y”) ,D 代表日,M 代表月,Y 代表年。登录 MomentDocs

 let currentMilli = Date.now()
let today = Moment(currentMilli).format("D/M/Y");
let tomorrow = Moment(currentMilli).add(1, 'days').format("D/M/Y");
let yesterday = Moment(currentMilli).subtract(1, 'days').format("D/M/Y");

结果是:

Current Milli - 1576693800000
today - 19/12/2019
tomorrow - 18/12/2019
yesterday - 18/12/2019

下面是我如何使用 片刻实现这一点:

  let today = moment().format('DD MMMM YYYY');


let tomorrow = moment().add(1, 'days').format('DD MMMM YYYY').toString();


let yesterday = moment().subtract(1, 'days').startOf('day').format('DD MMMM YYYY').toString();


enter image description here

在日期时间选择器中添加过去和未来的日期

import DateTimePickerModal from "react-native-modal-datetime-picker";
import moment from 'moment';




let addFutureDay = new Date();
addFutureDay = moment(addFutureDay).add(2, 'day').format('MM/DD/YYYY');
const FutureMonthAdd = moment(addFutureDay, 'MM/DD/YYYY').toDate();
   

let addPastDate = new Date();
addPastDate = moment(addPastDate).add(-2, 'day').format('MM/DD/YYYY');
const PastMonthAdd = moment(addPastDate, 'MM/DD/YYYY').toDate();


return (
<View>
<Text> DatePickerDemo </Text>
<Button title="Show Date Picker" onPress={showDatePicker} />
<DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
minimumDate={PastMonthAdd}
maximumDate={FutureMonthAdd}
onConfirm={handleConfirm}
onCancel={hideDatePicker}
/>


</View>
)

Const format edDate = moment (date) . format (“ DD-MM-YYYY hh: mm: ss a”)

Const format edDate2 = moment (date) . format (“ DD-MM-YYYY hh: mm A”)//DD-MM-YYYY hh: mm a