stringToDateTime static method

DateTime stringToDateTime(
  1. String s,
  2. {DateTime? time}
)

Converts English textual datetime description to a DateTime object.

If time is set, it will be used to determine the desired date. If time is null (the default), now is used to determine the date.

Example :

stringToDateTime('yesterday'); // will receive yesterday from now
stringToDateTime('yesterday', time: time); // will receive yesterday from the given date.

Supported strings:

  • now
  • + 1 year(s)|y 2 month(s)|mo 3 week(s)|w 4 hour(s)|h 5 minute(s)|m 6 second(s)|s
  • - 1 year(s)|y 2 month(s)|mo 3 week(s)|w 4 hour(s)|h 5 minute(s)|m 6 second(s)|s
  • yesterday (at 1 pm|1 hour|13:00:00)
  • tomorrow (at 1 pm|1 hour|13:00:00)
  • last monday (at 1 pm|1 hour|13:00:00)
  • next monday (at 1 pm|1 hour|13:00:00)
  • 10 September 2019 (at 1 pm|1 hour|13:00:00)
  • 1 day(s)|week(s)|month(s) ago
  • 2 pm next monday|week

Implementation

static DateTime stringToDateTime(String s, {DateTime? time}) {
  var now = DateTime.now();
  if (s == 'now') {
    return now;
  }
  now = time ?? now;
  if (s.startsWith('+')) {
    return _parseAddRem(s, now);
  } else if (s.startsWith('-')) {
    return _parseAddRem(s, now, rem: true);
  } else if (s.startsWith('next')) {
    return _parseNextLast(s, now);
  } else if (s.contains('next')) {
    var splitted = s.split('next');
    s = 'next ' + splitted.elementAt(1) + ' at ' + splitted.elementAt(0);
    return _parseNextLast(s, now);
  } else if (s.startsWith('last')) {
    return _parseNextLast(s, now, last: true);
  } else if (s.contains('last')) {
    var splitted = s.split('last');
    s = 'last ' + splitted.elementAt(1) + ' at ' + splitted.elementAt(0);
    return _parseNextLast(s, now, last: true);
  } else if (s.startsWith('yesterday')) {
    return _parseYesterdayTomorrow(s, now);
  } else if (s.startsWith('tomorrow')) {
    return _parseYesterdayTomorrow(s, now, tomorrow: true);
  } else if (s.contains('ago')) {
    return _parseAgo(s, now);
  } else {
    if (REGEX_DATE.hasMatch(s)) {
      return _parseDate(s);
    }
  }
  return DateTime.now();
}