dmtrKovalenko / date-io

Abstraction over common javascript date management libraries
MIT License
726 stars 90 forks source link

IUtils<TDate>.date method should be more locale aware #668

Open RafalOsieka opened 6 months ago

RafalOsieka commented 6 months ago

Hi,

I was investigating the issue in different UI library that uses the date-io to abstract the date/time functionality (https://github.com/vuetifyjs/vuetify/issues/19803).

It seems, that authors uses the adapter.date(...) (where adapter is the selected implementation of the time management lib).

Unfortunatelly, that method seems, to only care for the date provided in the format mm/dd/yyyy.

Let's assume the following example:

I think, that it will be just enough to extend the date method with some additional checks. The following is an example of the new date method implemenation for the date-fns interface, that should fix the issue (at least in a very common scenario).

import DateFnsAdapter from '@date-io/date-fns';
import { isValid as dateFnsIsValid } from 'date-fns';

class BetterDateFnsAdapter extends DateFnsAdapter {
  date(value) {
    if (typeof value === "undefined") return new Date();
    if (value === null) return null;

    const defaultParsedValue = super.date(value);
    if (dateFnsIsValid(defaultParsedValue)) return defaultParsedValue;

    try {
      let parseResult = this.parse(value, this.formats.keyboardDateTime24h);
      if (dateFnsIsValid(parseResult)) return parseResult;

      parseResult = this.parse(value, this.formats.keyboardDateTime);
      if (dateFnsIsValid(parseResult)) return parseResult;

      parseResult = this.parse(value, this.formats.keyboardDate);
      if (dateFnsIsValid(parseResult)) return parseResult;
    } catch {
      // ignore
    }

    return defaultParsedValue;
  }
}
dmtrKovalenko commented 6 months ago

The intention of the date method is not to parse the input but to create the date object from the most basic values like js date and iso string.

There are separate methods implemented with locale specific and format specific parsing.

RafalOsieka commented 6 months ago

In that case, the only option is to use the parse method like it was used in the example I provided.

Unfortunately, it requires to provide a format string, so it will be the job of the consumers of this library to make correct implementation for that.

Maybe it would be better to provide a new method in this library for that use case? For example, a new parse method that doesn't need an format string, but just tries to parse the provided value using the current locale?

dmtrKovalenko commented 6 months ago

It is by design restriction to avoid consumers of the library from the parsing of arbitary date strings. The date string that you are parsing must be always strictly formatted and provided for the users (thats why we exposer getFormatHelperText method)