Period و Duration
جزء من قسم المنطق وتدفق التنفيذ في رحلة Java على Coddy. الدرس 57 من 59.
يمثل Period مقدارًا زمنيًا قائمًا على التاريخ (سنوات، أشهر، أيام)، بينما تمثل Duration مقدارًا زمنيًا قائمًا على الوقت (ساعات، دقائق، ثوانٍ).
أنشئ فترة:
Period period = Period.of(1, 2, 15);
// 1 سنة، 2 شهران، 15 يومًاأنشئ مدة:
Duration duration = Duration.ofHours(2);
// 2 ساعتان
Duration minutes = Duration.ofMinutes(90);
// 90 دقيقةبعد تنفيذ الكود أعلاه، يحتوي period على:
P1Y2M15D // تنسيق ISO-8601قِس الفارق بين تاريخين باستخدام Period.between(). تأخذ هذه الدالة قيمتين من LocalDate وتقسم الفارق إلى سنوات وأشهر وأيام:
LocalDate start = LocalDate.of(2024, 1, 15);
LocalDate end = LocalDate.of(2025, 3, 20);
Period p = Period.between(start, end);
p.getYears(); // 1
p.getMonths(); // 2
p.getDays(); // 5تعيد getDays() الأيام المتبقية فقط بعد احتساب السنوات والأشهر الكاملة، وليس إجمالي عدد الأيام بين التاريخين. ويتيح لك LocalDateTime الحصول على التاريخ باستخدام toLocalDate().
قِس الفاصل بين وقتين باستخدام Duration.between()، التي تأخذ قيمتين من النوع LocalDateTime (أو LocalTime):
LocalDateTime from = LocalDateTime.of(2024, 3, 15, 10, 30);
LocalDateTime to = LocalDateTime.of(2024, 3, 15, 14, 45);
Duration d = Duration.between(from, to);
d.toHours(); // 4
d.toMinutes(); // 255
d.toMinutesPart(); // 15تحسب toMinutes() الفاصل كاملًا بالدقائق، بما في ذلك الساعات. وتعطي toMinutesPart() الدقائق المتبقية بعد الساعات الكاملة، لذا فإن هذا الفاصل يساوي 4 ساعات و15 دقيقة.
التحدي
سهلأنشئ طريقة باسم calculateDifference تأخذ أربع وسيطات:
- سلسلة نصية (
start) بالتنسيق "yyyy-MM-dd HH:mm" - سلسلة نصية (
end) بالتنسيق "yyyy-MM-dd HH:mm" - سلسلة نصية (
unit) قيمتها إما "period" أو "duration" - سلسلة نصية (
format) قيمتها إما "full" أو "simple"
ينبغي للطريقة أن:
- تحسب الفرق بين تاريخي البدء والانتهاء
- تعيد الفرق بالتنسيق المحدد
ينبغي أن تكون رسائل الإرجاع كما يلي:
- إذا كانت التواريخ غير صالحة: أعد "Invalid date format"
- إذا كانت الوحدة غير صالحة: أعد "Invalid unit"
- إذا كان التنسيق غير صالح: أعد "Invalid format"
- للفترة بالتنسيق "full": "Years: X, Months: Y, Days: Z"
- للفترة بالتنسيق "simple": "XyYmZd"
- للمدة بالتنسيق "full": "Hours: X, Minutes: Y"، حيث تمثل Y الدقائق المتبقية بعد الساعات الكاملة
- للمدة بالتنسيق "simple": "XhYm"
جرّب بنفسك
import java.util.Scanner;
import java.time.*;
import java.time.format.*;
public class Main {
public static String calculateDifference(String start, String end, String unit, String format) {
// اكتب الكود الخاص بك هنا
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String start = scanner.nextLine();
String end = scanner.nextLine();
String unit = scanner.nextLine();
String format = scanner.nextLine();
System.out.println(calculateDifference(start, end, unit, format));
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادمراجعة - المصفوفات ثنائية الأبعادجمع وطرح المصفوفاتالمصفوفات المتعرجة (Jagged Arrays)المصفوفات ثلاثية الأبعاد وما بعدهاأنماط المصفوفات ثنائية الأبعاد الشائعةمراجعة - كل شيء عن المصفوفات4HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمالمسح والنسخملخص - HashSet10التاريخ والوقت
أساسيات LocalDateعمليات LocalTimeاستخدام LocalDateTimePeriod و Durationتنسيق التاريخالتعامل مع المناطق الزمنية2HashMap الجزء الأول
ما هو الـ HashMap؟تعريف الـ HashMapالوصول إلى القيمالتحقق من وجود المفتاحتعديل القواميسملخص - HashMap3HashMap الجزء الثاني
دوال HashMapالتكرار باستخدام keySet()التكرار باستخدام entrySet()HashMap متداخلمراجعة - إدارة المستودعمراجعة - عمليات HashMap6التحكم المتقدم في تدفق البرنامج
العبارات المعنونةتعبير Switchمطابقة الأنماطجمل الحمايةمراجعة - تدفق التحكمتدرّب بنفسك: مترجم Java عبر الإنترنت