确定日期是包含日期还是仅包含月份信息

时间:2018-01-08 12:48:11

标签: javascript momentjs

我试图弄清楚是否可以知道moment对象是否与daymonth一起创建。

示例

const date1 = moment("2018-08");
const date2 = moment("2018-08-01");

/* Determine if date1 was set with a day or not */

2 个答案:

答案 0 :(得分:1)

您可以像这样检查输入日期的格式。

const date1 = moment("2018-08");
const date2 = moment("2018-08-01");
date1._f // "YYYY-MM"
date2._f // "YYYY-MM-DD"

if ( date1._f == "YYYY-MM") { ... }

答案 1 :(得分:1)

您可以使用creationData()获取用于创建时刻对象的格式:

  

创建片刻对象后,可以使用creationData()方法访问所有输入:

moment("2013-01-02", "YYYY-MM-DD", true).creationData() === {
    input: "2013-01-02",
    format: "YYYY-MM-DD",
    locale: Locale obj,
    isUTC: false,
    strict: true
}

在您的情况下,您可以使用类似

的内容
if( date1.creationData().format.includes('DD') )

请注意,date1.creationData().format可以是undefined

在这里,我编写了一个函数,该函数使用creationData()parsingFlags()invalidAt()来考虑更多边缘情况(无效时刻,从JS日期或unix时间戳创建的时刻对象):

function isDaySet(m){
  if( moment.isMoment(m) ){
    if( !m.isValid() ){
      return m.invalidAt() > 2;
    }
  
    let creationData = m.creationData();
    if( creationData.format && creationData.format.includes('DD') ){
      return true;
    }
    let parsingFlags = m.parsingFlags();
    if( !parsingFlags.iso &&
        typeof creationData.input === 'string' ){
      let mFormatted = m.format('YYYY-MM-D');
      return creationData.input.includes(mFormatted);
    }
  }
  return false;
}

let arr = [
  moment("2018-08"),
  moment("2018-08-01"),
  moment("2018-08-1"),
  moment("2018-08-01 11"),
  moment("01 02 2018", "DD MM YYYY"),
  moment(1515424366),
  moment("2018-08-01 27:77"),
  moment("2018-Marbruary-01", 'YYYY-MMMM-DD'),
  moment('Marbruary', 'MMMM')
];

arr.forEach((m) => {
  console.log(isDaySet(m)); 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>