Menu
CoddyTech

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는 연중 날짜를 나타냅니다. 패턴의 쉼표와 공백은 그대로 유지됩니다.

challenge icon

챌린지

쉬움

이벤트 목록에 원시 날짜가 표시됩니다. 각 날짜를 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),
    );
  }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

데이터와 네트워크의 모든 레슨

직접 연습해 보세요: 온라인 Flutter 컴파일러