DateFormat으로 날짜 다루기
Coddy Flutter 여정의 데이터와 네트워크 섹션에 포함된 레슨. 27개 중 20번째.
서버는 날짜를 "2026-11-03T18:30:00"처럼 고정된 형식의 텍스트로 전송합니다. 연도, 월, 일, 그다음 시간입니다. DateTime.parse는 이 텍스트를 DateTime으로 변환합니다. DateTime을 그대로 출력하면 2026-11-03 18:30:00.000처럼 보이는데, 휴대전화 화면에서 이렇게 읽고 싶은 사람은 없습니다.
intl 패키지는 사람이 읽기 쉽도록 날짜의 형식을 지정합니다. DateFormat은 날짜의 각 부분을 나타내는 문자들인 패턴을 사용합니다.
import 'package:intl/intl.dart';
final day = DateTime.parse('2026-11-03T18:30:00');
DateFormat('EEE, MMM d').format(day) // 화요일, 11월 3일
DateFormat('EEEE d MMMM').format(day) // 화요일 3일 11월E는 요일, M은 월, d는 날짜를 나타냅니다. 문자가 늘어나면 더 긴 형식이 됩니다. EEE는 Tue, EEEE는 Tuesday, MMM은 Nov, MMMM은 November, MM은 11입니다. 대소문자가 중요합니다. D는 연중 날짜를 나타냅니다. 패턴의 쉼표와 공백은 그대로 유지됩니다.
챌린지
쉬움이벤트 목록에 원시 날짜가 표시됩니다. 각 날짜를 DateFormat으로 형식화하여 첫 번째 이벤트가 Tue, Nov 3으로 표시되게 하세요. intl 가져오기는 이미 되어 있습니다.
직접 해보기
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),
);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
데이터와 네트워크의 모든 레슨
직접 연습해 보세요: 온라인 Flutter 컴파일러