Datas com DateFormat
Parte da seção Dados e rede do Journey de Flutter da Coddy. Lição 20 de 27.
Os servidores enviam datas como texto em um formato fixo, como "2026-11-03T18:30:00": ano, mês, dia e, depois, o horário. DateTime.parse transforma esse texto em um DateTime. Impresso como está, um DateTime fica assim: 2026-11-03 18:30:00.000, algo que ninguém quer ler no celular.
O pacote intl formata datas para as pessoas. DateFormat recebe um padrão, letras que representam as partes de uma data:
import 'package:intl/intl.dart';
final day = DateTime.parse('2026-11-03T18:30:00');
DateFormat('EEE, MMM d').format(day) // ter., 3 de nov.
DateFormat('EEEE d MMMM').format(day) // terça-feira, 3 de novembroE representa o dia da semana, M o mês e d o dia do mês. Mais letras produzem uma forma mais longa: EEE é Tue, EEEE é Tuesday, MMM é Nov, MMMM é November, MM é 11. Letras maiúsculas fazem diferença: D representa o dia do ano. Vírgulas e espaços no padrão são mantidos como estão.
Desafio
FácilA lista de eventos exibe datas sem formatação. Formate cada uma com DateFormat, para que o primeiro evento seja exibido como Tue, Nov 3. A importação de intl já está lá.
Experimente você mesmo
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: EventsScreen(),
);
}
}
class EventsScreen extends StatefulWidget {
const EventsScreen({super.key});
@override
State<EventsScreen> createState() => _EventsScreenState();
}
class _EventsScreenState extends State<EventsScreen> {
late Future<List<Event>> _events;
@override
void initState() {
super.initState();
_events = loadEvents();
}
Future<List<Event>> loadEvents() async {
final body = await fetch('/events');
final items = jsonDecode(body) as List<dynamic>;
return items.map((item) => Event.fromJson(item as Map<String, dynamic>)).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Events')),
body: FutureBuilder<List<Event>>(
future: _events,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(child: Text('Could not load: ${snapshot.error}'));
}
if (snapshot.hasData) {
final events = snapshot.data!;
return ListView.builder(
itemCount: events.length,
itemBuilder: (context, index) {
final event = events[index];
return ListTile(
title: Text(event.title),
subtitle: Text('${event.start}'),
);
},
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
}
class Event {
Event({required this.title, required this.start});
final String title;
final DateTime start;
factory Event.fromJson(Map<String, dynamic> json) {
return Event(
title: json['title'] as String,
start: DateTime.parse(json['start'] as String),
);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Dados e rede
Pratique por conta própria: Compilador de Flutter online