Menu
CoddyTech
flag Ar iconالعربيةdown icon

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 دقيقة.

challenge icon

التحدي

سهل

أنشئ طريقة باسم calculateDifference تأخذ أربع وسيطات:

  1. سلسلة نصية (start) بالتنسيق "yyyy-MM-dd HH:mm"
  2. سلسلة نصية (end) بالتنسيق "yyyy-MM-dd HH:mm"
  3. سلسلة نصية (unit) قيمتها إما "period" أو "duration"
  4. سلسلة نصية (format) قيمتها إما "full" أو "simple"

ينبغي للطريقة أن:

  1. تحسب الفرق بين تاريخي البدء والانتهاء
  2. تعيد الفرق بالتنسيق المحدد

ينبغي أن تكون رسائل الإرجاع كما يلي:

  • إذا كانت التواريخ غير صالحة: أعد "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));
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Java عبر الإنترنت