Menu
Coddy logo textTech

טיפול באזורי זמן

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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 אונליין