parseDateTime static method

DateTime? parseDateTime(
  1. dynamic value
)

Parses the given value into a DateTime object. If the value cannot be parsed then null will be returned.

The following formats will result in the DateTime object being returned as a UTC based DateTime:

  • "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
  • "yyyy-MM-dd'T'HH:mm:ss'Z'"
  • "yyyy-MM-dd'T'HH:mm'Z'"

The following formats will result in the DateTime object being returned as a local timezone based DateTime:

  • "yyyy-MM-dd'T'HH:mm:ss"
  • "yyyy-MM-dd'T'HH:mm"
  • 'yyyy-MM-dd'
  • 'MM/dd/yyyy'

Alternatively, the value may be in UTC Millis and that will also properly decode to a DateTime.

Implementation

static DateTime? parseDateTime(dynamic value) {
  DateTime? result;

  if (value is DateTime) {
    result = value;
  } else {
    result = parseUtcMillis(value);
  }

  if (value != null) {
    const utcPatterns = [
      "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
      "yyyy-MM-dd'T'HH:mm:ss'Z'",
      "yyyy-MM-dd'T'HH:mm'Z'",
    ];

    const patterns = [
      "yyyy-MM-dd'T'HH:mm:ss.SSS",
      "yyyy-MM-dd'T'HH:mm:ss",
      "yyyy-MM-dd'T'HH:mm",
      'yyyy-MM-dd',
      'MM/dd/yyyy'
    ];

    for (var pattern in utcPatterns) {
      try {
        result = DateFormat(pattern).parse(
          value,
          true,
        );
        break;
      } catch (e) {
        // no-op
      }
    }
    if (result == null) {
      for (var pattern in patterns) {
        try {
          result = DateFormat(pattern).parse(value, false);
          break;
        } catch (e) {
          // no-op
        }
      }
    }
  }

  return result;
}