Introducción a la clase DateTime
Como su nombre lo indica, la clase DateTime de Flutter te permite crear variables de fechas o horas. Te permite representar un punto específico en el tiempo, incluyendo tanto la fecha (año, mes, día) como la hora (hora, minuto, segundo, milisegundo).
Esta clase también te permite utilizar una variedad de métodos y operadores para comparar fechas, cambiar su formato o modificarlas.
- Por ejemplo, la clase DateTime puede ser útil si necesitas:
- Calcular la duración entre dos eventos, etc.
- Mostrar la hora en tu aplicación;
- Crear y modificar eventos en un calendario;
- Configurar notificaciones de recordatorio;
- Registrar el momento en que un usuario realiza una acción (por ejemplo, una compra);
Obtener la fecha y hora actual
Para obtener la fecha y hora actual en una aplicación Flutter, la clase DateTime ofrece varios métodos.
El método más simple y común para obtener la fecha y hora actual es usar DateTime.now(). Este método devuelve un objeto DateTime que representa la fecha y hora actuales en el tiempo local, en el momento en que se llama al método.
void main() {
DateTime now = DateTime.now();
print("Fecha y hora actual: $now");
}
En cambio, si necesitas el tiempo UTC (Tiempo Universal Coordinado), utiliza el método DateTime.now().toUtc().
void main() {
DateTime nowUtc = DateTime.now().toUtc();
print("Fecha y hora actual en UTC: $nowUtc");
}
También debes saber que existe un package Flutter Clock, que te permite manipular variables de tiempo y puede ser bastante útil para realizar pruebas unitarias. Este te da acceso a la hora actual a través de su método Clock.now().
Formatear una fecha o una hora
Flutter permite trabajar con diferentes formatos de fecha y hora gracias a la clase DateFormat del paquete intl.
Formato ISO 8601
El formato ISO 8601 es un estándar internacional para representar fechas y horas. A menudo se utiliza para el intercambio de datos entre sistemas.
import 'package:intl/intl.dart';
void main() {
DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
DateFormat isoFormat = DateFormat("yyyy-MM-ddTHH:mm:ssZ");
String isoFormatted = isoFormat.format(specificTime);
print("Formato ISO 8601: $isoFormatted"); // Formato ISO 8601: 2024-06-17T15:30:00Z
}
Formato local
Para mostrar las fechas en un formato local, puedes especificar el lugar de tu elección. Aquí tienes un ejemplo para Francia:
import 'package:intl/intl.dart';
void main() {
DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
DateFormat localFormat = DateFormat.yMMMMEEEEd('fr_FR').add_Hms();
String localFormatted = localFormat.format(specificTime);
print("Formato local: $localFormatted"); // Formato local: lunes 17 junio 2024 15:30:00
}
Formato corto (solo fecha)
El formato corto es útil para mostrar fechas de manera concisa, como en listas o encabezados.
import 'package:intl/intl.dart';
void main() {
DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
DateFormat shortDateFormat = DateFormat.yMd();
String shortDate = shortDateFormat.format(specificTime);
print("Formato corto: $shortDate"); // Formato corto: 6/17/2024
}
Formato completo (fecha y hora)
El formato completo incluye tanto la fecha como la hora, útil para visualizaciones detalladas.
import 'package:intl/intl.dart';
void main() {
DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
DateFormat fullDateFormat = DateFormat.yMMMMd().add_jm();
String fullDate = fullDateFormat.format(specificTime);
print("Formato completo: $fullDate"); // Formato completo: 17 de junio de 2024 3:30 PM
}
Formato personalizado
Finalmente, puedes crear formatos personalizados según tus necesidades, combinando diferentes símbolos de formato.
import 'package:intl/intl.dart';
void main() {
DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
// Formato personalizado: "Día de la semana, Día Mes Año, Hora:Minuto:Segundo"
DateFormat customFormat = DateFormat("EEEE, d MMMM yyyy, HH:mm:ss");
String customFormatted = customFormat.format(specificTime);
print("Formato personalizado: $customFormatted"); // Formato personalizado: lunes, 17 de junio de 2024, 15:30:00
// Otro ejemplo: "Día/Mes/Año Hora:Minuto AM/PM"
DateFormat anotherCustomFormat = DateFormat("dd/MM/yyyy hh:mm a");
String anotherCustomFormatted = anotherCustomFormat.format(specificTime);
print("Otro formato personalizado: $anotherCustomFormatted"); // Otro formato personalizado: 17/06/2024 03:30 PM
}
Comparar dos fechas u horas entre sí
Flutter proporciona varias formas de comparar fechas u horas. Esto se puede hacer mediante los operadores de comparación estándar, pero también a través de métodos específicos como isBefore()
e isAfter()
.
Uso de los operadores de comparación (==, !=, <, >, <=, >=)
Los operadores de comparación te permiten comparar directamente dos objetos DateTime. A continuación, algunos ejemplos para ilustrar su uso:
void main() {
DateTime date1 = DateTime(2024, 6, 17, 15, 30, 0);
DateTime date2 = DateTime(2024, 6, 17, 18, 45, 0);
DateTime date3 = DateTime(2023, 12, 25, 10, 0, 0);
// Ejemplo simple: comparación de igualdad
bool isEqual = date1 == date2;
print("date1 == date2 : $isEqual"); // false
// Ejemplo intermedio: comparación de desigualdad
bool isNotEqual = date1 != date3;
print("date1 != date3 : $isNotEqual"); // true
// Ejemplo complejo: uso de varios operadores
bool isBeforeOrEqual = date1 <= date2;
bool isAfterOrEqual = date2 >= date3;
print("date1 <= date2 : $isBeforeOrEqual"); // true
print("date2 >= date3 : $isAfterOrEqual"); // true
}
Métodos isBefore()
e isAfter()
Los métodos isBefore()
e isAfter()
de la clase DateTime también te permiten verificar si una fecha es anterior o posterior a otra. A continuación, algunos ejemplos para ilustrar su uso:
void main() {
DateTime date1 = DateTime(2024, 6, 17, 15, 30, 0);
DateTime date2 = DateTime(2024, 6, 17, 18, 45, 0);
DateTime date3 = DateTime(2023, 12, 25, 10, 0, 0);
// Ejemplo simple: uso de isBefore()
bool isDate1BeforeDate2 = date1.isBefore(date2);
print("date1 es anterior a date2 : $isDate1BeforeDate2"); // true
// Ejemplo intermedio: uso de isAfter()
bool isDate2AfterDate3 = date2.isAfter(date3);
print("date2 es posterior a date3 : $isDate2AfterDate3"); // true
// Ejemplo complejo: combinar isBefore() e isAfter() para verificar si una fecha está entre dos otras
bool isDate1Between = date1.isAfter(date3) && date1.isBefore(date2);
print("date1 está entre date3 y date2 : $isDate1Between"); // true
}
Obtener la duración entre dos fechas u horas
Para calcular la duración entre dos fechas u horas en Flutter, utilizarás la clase Duration
. Esta clase permite representar una duración fija, medida en términos de días, horas, minutos, segundos y microsegundos.
Gracias a su método difference()
, la clase Duration
te permite calcular la diferencia entre dos objetos de tipo DateTime
. Una vez obtenida esta duración, incluso podrás acceder a los días, horas, minutos, segundos y microsegundos individualmente.
A continuación, un ejemplo que ilustra cómo utilizar Duration
para calcular la duración entre dos fechas u horas:
void main() {
DateTime start = DateTime(2024, 6, 17, 10, 0, 0);
DateTime end = DateTime(2024, 6, 17, 15, 30, 0);
Duration difference = end.difference(start);
print("Duración entre $start y $end : $difference");
// Duración entre 2024-06-17 10:00:00.000 y 2024-06-17 15:30:00.000 : 5:30:00.000000
}
Métodos para extraer partes específicas de la duración
La clase Duration
ofrece varios métodos para acceder a los componentes individuales de una duración:
inDays
: Devuelve el número de días en la duración.inHours
: Devuelve el número de horas restantes después de la conversión en días.inMinutes
: Devuelve el número de minutos restantes después de la conversión en horas.inSeconds
: Devuelve el número de segundos restantes después de la conversión en minutos.inMilliseconds
: Devuelve el número de milisegundos restantes después de la conversión en segundos.inMicroseconds
: Devuelve el número de microsegundos restantes después de la conversión en milisegundos.
A continuación, se muestra cómo utilizar estos métodos para extraer partes específicas de una duración:
void main() {
DateTime start = DateTime(2024, 6, 17, 10, 0, 0);
DateTime end = DateTime(2024, 6, 20, 15, 45, 0);
Duration difference = end.difference(start);
int days = difference.inDays;
int hours = difference.inHours % 24;
int minutes = difference.inMinutes % 60;
int seconds = difference.inSeconds % 60;
print("Duración total: $days días, $hours horas, $minutes minutos, $seconds segundos");
// Duración total: 3 días, 5 horas, 45 minutos, 0 segundos
}
Manipular fechas (añadir o restar tiempo)
Para añadir o restar tiempo a una variable de tipo DateTime
, Flutter pone a disposición los métodos add()
y subtract()
.
Método add()
El método add()
permite añadir una Duration
a un objeto DateTime
, lo cual es útil para calcular una fecha futura a partir de una fecha dada.
void main() {
DateTime now = DateTime.now();
Duration durationToAdd = Duration(days: 5, hours: 3, minutes: 20);
DateTime futureDate = now.add(durationToAdd);
print("Fecha dentro de 5 días, 3 horas y 20 minutos: $futureDate");
// Fecha dentro de 5 días, 3 horas y 20 minutos: 2024-06-22 19:11:53.862
}
Método subtract()
El método subtract()
funciona de manera similar, pero resta una Duration
de un objeto DateTime
, permitiendo calcular una fecha pasada a partir de una fecha dada.
void main() {
DateTime now = DateTime.now();
Duration durationToSubtract = Duration(days: 10);
DateTime pastDate = now.subtract(durationToSubtract);
print("Fecha hace 10 días: $pastDate");
// Fecha hace 10 días: 2024-06-07 19:11:53.862
}
Conclusión
Ahora ya puedes manipular variables de tipo Fecha u Hora. El último tipo de variable que te voy a presentar son los URIs: