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

التعامل مع المناطق الزمنية

جزء من قسم المنطق وتدفق التنفيذ في رحلة Java على Coddy. الدرس 59 من 59.

يمثل ZonedDateTime في Java تاريخًا ووقتًا مع منطقة زمنية. وهو مفيد عند العمل مع مناطق زمنية مختلفة أو التحويل بينها.

أنشئ وقتًا في منطقة زمنية محددة:

ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

يمكنك أيضًا إنشاء ZonedDateTime من LocalDateTime باستخدام .atZone():

LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));

حوِّل الوقت بين المناطق:

ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

بعد تنفيذ الشيفرة أعلاه، يحتوي newYork على اللحظة نفسها الموجودة في tokyo، ولكن في المنطقة الزمنية لنيويورك:

2024-03-15T10:30-04:00[America/New_York]
// مخرجات المثال

لتنسيق ZonedDateTime، استخدم DateTimeFormatter. أضف الإزاحة باستخدام النمط xxx: فهو يطبع +09:00 أو -04:00، ويطبع الإزاحة الصفرية كـ +00:00 (بينما يطبع XXX بحروف كبيرة Z للإزاحة الصفرية بدلًا من ذلك):

// بدون إزاحة
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// مع إزاحة (مثل +09:00 أو -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// مثال: 2024-03-15 10:30 -04:00
challenge icon

التحدي

سهل

أنشئ دالة باسم convertTime تأخذ أربع وسيطات:

  1. سلسلة نصية (dateTimeStr) بالتنسيق "yyyy-MM-dd HH:mm"
  2. سلسلة نصية (sourceZone) لمعرّف المنطقة الزمنية المصدر
  3. سلسلة نصية (targetZone) لمعرّف المنطقة الزمنية الهدف
  4. قيمة منطقية (showOffset) تحدد ما إذا كان يجب تضمين إزاحة المنطقة الزمنية في الناتج

يجب أن تقوم الدالة بما يلي:

  1. تحليل التاريخ والوقت المُدخلين في المنطقة الزمنية المصدر
  2. تحويلهما إلى المنطقة الزمنية الهدف
  3. إرجاع معلومات منسقة حول كلا الوقتين

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

  • إذا كان التاريخ والوقت غير صالحين: أرجع "Invalid datetime format"
  • إذا كانت المنطقة غير صالحة: أرجع "Invalid time zone"
  • إذا كانت قيمة showOffset هي true: قم بتضمين الإزاحة في الناتج، مع تنسيقها باستخدام النمط xxx، بحيث تتم طباعة الإزاحة الصفرية كـ +00:00
  • التنسيق: "Source: [time1], Target: [time2]"

جرّب بنفسك

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String convertTime(String dateTimeStr, String sourceZone, 
                                   String targetZone, boolean showOffset) {
        // اكتب الكود الخاص بك هنا
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String dateTimeStr = scanner.nextLine();
        String sourceZone = scanner.nextLine();
        String targetZone = scanner.nextLine();
        boolean showOffset = Boolean.parseBoolean(scanner.nextLine());
        
        System.out.println(convertTime(dateTimeStr, sourceZone, targetZone, showOffset));
    }
}
quiz iconاختبر نفسك

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

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

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