stringToDateTime static method
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();
}