الأوقات باستخدام DateFormat
جزء من قسم البيانات والشبكة في رحلة Flutter على Coddy. الدرس 21 من 27.
يحتوي DateTime نفسه على الوقت أيضًا، ويُنسّقه DateFormat باستخدام أحرفه الخاصة:
final start = DateTime.parse('2026-11-03T18:30:00');
DateFormat('h:mm a').format(start) // 6:30 PM
DateFormat('HH:mm').format(start) // 18:30يمثّل h الساعة وفق نظام 12 ساعة، ويمثّل H الساعة وفق نظام 24 ساعة، ويمثّل mm الدقائق، بينما يضيف a AM أو PM. يُبقي استخدام حرفين الصفرَ في بداية الرقم: يكتب HH الساعة التاسعة على شكل 09.
انتبه مجددًا إلى الأحرف الكبيرة. فـmm الصغيرة تعني الدقائق، بينما MM الكبيرة تعني الشهر: يحوّل h:MM a الوقت 6:30 PM في نوفمبر إلى 6:11 PM، لأن نوفمبر هو الشهر 11.
التحدي
سهلاعرض وقت بدء كل فعالية: أضف نصًا في trailing لكل ListTile يتضمن الوقت، بحيث يظهر وقت الفعالية الأولى 6:30 PM.
جرّب بنفسك
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(DateFormat('EEE, MMM d').format(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),
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البيانات والشبكة
2شاشات التحميل
مؤشر دائري أثناء التحميلتعرّف على FutureBuilderجلب البيانات مرة واحدة في initStateإعادة تحميل البيانات بزرالسحب للتحديث5التواريخ والأسعار
التواريخ باستخدام DateFormatالأوقات باستخدام DateFormatالأسعار باستخدام NumberFormatتدرّب بنفسك: مترجم Flutter عبر الإنترنت