convertToSaveDateTime static method

String? convertToSaveDateTime(
  1. String fechaString
)

esta funcion recibe un string con una fecha y hora en formato DD/MM/YYYY HH:MM:SS y devuelve la fecha en formato ISODate (YYYY-MM-DDTHH:MM:SSZ) si la fecha es válida, de lo contrario devuelve null.

Parámetros:

  • fechaString (String): La cadena de fecha en formato DD/MM/YYYY HH:MM:SS.

Retorna:

  • String?: La fecha en formato ISODate (YYYY-MM-DDTHH:MM:SSZ) si es válida, de lo contrario null.

Ejemplo:

String? fechaISO = convertToISODate('31/12/2021 09:31:20');
print(fechaISO); // Imprime: 2021-12-31T09:31:20.000Z

La función convertToISODate realiza las siguientes operaciones:

Implementation

static String? convertToSaveDateTime(String fechaString) {
  ///Expresion regular para validar que la fecha ya no venga en su formato de guardado
  ///Si la fecha viene en el formato : YYYY-MM-DDTHH:MM:SSZ devuelve la misma fecha
  final regex = RegExp(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$');
  bool fechaValida = regex.hasMatch(fechaString);
  if (fechaValida) return fechaString;

  /// Expresión regular que valida una fecha en formato DD/MM/YYYY HH:MM:SS
  final RegExp dateTimeRegExp =
      RegExp(r'^(\d{2})\/(\d{2})\/(\d{4})(?: (\d{2}):(\d{2}):(\d{2}))?$');

  /// Valida si la fecha cumple con el formato DD/MM/YYYY
  if (dateTimeRegExp.hasMatch(fechaString)) {
    /// Extrae el día, mes, año, hora, minuto y segundo de la cadena de fecha
    final match = dateTimeRegExp.firstMatch(fechaString);
    int day = int.parse(match?.group(1) ?? '0');
    int month = int.parse(match?.group(2) ?? '0');
    int year = int.parse(match?.group(3) ?? '0');
    int hour = int.parse(match?.group(4) ?? '0');
    int minute = int.parse(match?.group(5) ?? '0');
    int second = int.parse(match?.group(6) ?? '0');

    /// Intenta crear un objeto DateTime con los valores de día, mes, año, hora, minuto y segundo
    try {
      DateTime dateTime = DateTime(year, month, day, hour, minute, second);

      /// Verifica si la fecha es válida
      if (dateTime.day == day &&
          dateTime.month == month &&
          dateTime.year == year &&
          dateTime.hour == hour &&
          dateTime.minute == minute &&
          dateTime.second == second) {
        String formattedDateTime =
            "${dateTime.year.toString().padLeft(4, '0')}-"
            "${dateTime.month.toString().padLeft(2, '0')}-"
            "${dateTime.day.toString().padLeft(2, '0')}";

        formattedDateTime += "T${dateTime.hour.toString().padLeft(2, '0')}:"
            "${dateTime.minute.toString().padLeft(2, '0')}:"
            "${dateTime.second.toString().padLeft(2, '0')}"
            ".000Z";

        /// Devuelve la fecha en formato "YYYY-MM-DD HH:MM:SS.000Z"
        return formattedDateTime;
        //  .toUtc().toIso8601String();
      } else {
        FlutterUtilsProvider.logDebug('La fecha no es válida: $fechaString');

        /// Si la fecha no es válida, devuelve null
        return null;
      }
    } catch (error) {
      FlutterUtilsProvider.logDebug(
          'Error al convertir la fecha $fechaString a ISODate: $error');

      /// Si la creación de DateTime falla, devuelve null
      return null;
    }
  } else {
    FlutterUtilsProvider.logDebug(
        'La fecha no cumple con el formato DD/MM/YYYY $fechaString');

    /// Si la fecha no cumple con el formato DD/MM/YYYY, devuelve null
    return null;
  }
}