Moment.js - 明天、今天和昨天

Posted

技术标签:

【中文标题】Moment.js - 明天、今天和昨天【英文标题】:Tomorrow, today and yesterday with MomentJS 【发布时间】:2016-05-28 06:41:30 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

let today     = moment();

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

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

【讨论】:

官方api中没有这个!请提供您为此使用的 polyfill 在此处查看文档momentjs.com/docs/#/manipulating/add 我唯一添加的是new Date() 以避免lib 不断给我的警告(请参阅momentjs.com/docs/#/parsing/now) 很抱歉投了反对票,但这不是我想要的。我很惊讶这是投票率最高的答案(在撰写本文时)...... 是的,我确实添加了它作为我自己和其他人的参考,这些人可能会因为问题标题的措辞而最终来到这里。看起来它帮助了很多人,我很高兴。 :) momentjs.com/guides/#/lib-concepts/mutability这不是'add'的官方用法吗?【参考方案2】:

我将add()endOf() 与moment 结合使用

//...
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] 我建议您现在使用 dayjs,它具有与 moment 相同的 API 并且是轻量级的 ;)

【讨论】:

【参考方案3】:

您可以使用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 尚未弃用,但更新了答案以使用更新的方法。

【讨论】:

这改变了全球本地化,我只需要在 1 个地方 :) 查看编辑——您可以创建自定义区域设置而不是覆盖现有区域设置【参考方案4】:

要求:

当日期更远时,使用标准的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 版本开始,日历函数的格式参数可以是回调,请参阅http://momentjs.com/docs/#/displaying/calendar-time/。

【讨论】:

????????【参考方案5】:

你可以用这个:


const today     = moment();

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

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

【讨论】:

HussienK 的重复答案 但他发布了第一个? 是的,但这是更改后的【参考方案6】:

这是我使用 moment 的方法:

  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();

【讨论】:

【参考方案7】:

我有类似的解决方案,但允许使用语言环境:

    let date = moment(someDate);
    if (moment().diff(date, 'days') >= 1) 
        return date.fromNow(); // '2 days ago' etc.
    
    return date.calendar().split(' ')[0]; // 'Today', 'yesterday', 'tomorrow'

【讨论】:

它有效,但如果你将 '>=1' 更改为 '>=2',那么你将得到 'yesterday' 字符串而不是 '1 day ago'。【参考方案8】:

从 2.10.5 开始支持每次调用指定日历输出格式 如需更详细的文档,请查看Moment - Calendar。

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

【讨论】:

为什么投反对票?让我知道,这样我就可以改进这一点 这是答案。 这是我认为的正确答案。但它仍然不返回“3天前”类型的结果,除非高度定制【参考方案9】:

在 Moment.js 中,from() 方法具有您正在寻找的每日精度:

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"

【讨论】:

谢谢,但它仍然不显示“今天”,而是显示前。 “1 天前”而不是“昨天” - 看起来我需要自定义的功能 from 并没有真正的每日精度。例如,如果昨天是四个小时前,而我选择了一个五个小时前的时间,它会说“5 小时前”而不是昨天。此解决方案与from 的精度无关,而是与传入的日期无关。【参考方案10】:

这就是我最终做的事情

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];

【讨论】:

我也有同样的问题,但是我需要申请i18n,而且我有10种语言...所以我依赖momentJS国际化...【参考方案11】:

您可以使用 .add() 和 .subtract() 方法来获取昨天和明天的日期。然后使用 format 方法只获取日期 .format("D/M/Y"),D 代表日,M 代表月,Y 代表年。 Check in Moment Docs

 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

【讨论】:

【参考方案12】:
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]

【讨论】:

【参考方案13】:

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

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 formatedDate= moment(date).format("DD-MM-YYYY hh:mm:ss a")

const formatedDate2= moment(date).format("DD-MM-YYYY hh:mm A") // DD-MM-YYYY hh:mm a

【讨论】:

还必须安装 react-native 社区库

以上是关于Moment.js - 明天、今天和昨天的主要内容,如果未能解决你的问题,请参考以下文章

js 获取昨天,今天和明天的年月日格式

js获取日期:昨天今天和明天后天

js获取日期:昨天今天和明天后天 [转贴记录]

Golang 昨天今天和明天

RPC软件的昨天今天和明天

创始人 KK:Jenkins 的昨天今天和明天