Search code examples
luxon

How to check if obj is of type luxon?


I am writing a date adapter for Angular Material, and need a function that returns a boolean if the provided object is a luxon DateTime.

Something like this (from moment):

isDateInstance(obj: any): boolean {
    return moment.isMoment(obj);
  }

What I have is this so far - is this good enough?:

isDateInstance(obj: any): boolean {
      try {
          const luxonObject = DateTime.fromObject(obj);
          return luxonObject.isValid;
      } catch (error) {
          return false;
      }
  }

Solution

  • I think that your code is fine, I would suggest that you can use native instanceof.

    const DateTime = luxon.DateTime;
    
    function isDateInstance(obj) {
        return obj instanceof DateTime;
    }
    
    console.log( isDateInstance('') );
    console.log( isDateInstance({}) );
    console.log( isDateInstance(new Date()) );
    console.log( isDateInstance(DateTime.local()) );
    <script src="https://moment.github.io/luxon/global/luxon.min.js"></script>

    EDIT:

    Luxon has added isDateTime method in v.1.6.0 that

    Check if an object is a DateTime. Works across context boundaries

    so an updated solution can be the following:

    const DateTime = luxon.DateTime;
    
    function isDateInstance(obj) {
        return DateTime.isDateTime(obj);
    }
    
    console.log( isDateInstance('') );
    console.log( isDateInstance({}) );
    console.log( isDateInstance(new Date()) );
    console.log( isDateInstance(DateTime.local()) );
    <script src="https://cdn.jsdelivr.net/npm/luxon@1.10.0/build/global/luxon.js"></script>

    From v.1.6.0 until v.1.8.3 isDateTime will give undefined instead of false due to an issue.