Joda-Time: یہ کیا ہے، تاریخوں کی لائبریری اور Java 8 کا متبادل

مصنف: IT Sectr اشاعت: 2026-07-14 مطالعے کا وقت: 10 منٹ

Joda-Time — Java میں تاریخ اور وقت کے ساتھ کام کرنے کے لیے ایک لائبریری، جسے Stephen Colebourne نے java.util.Date اور java.util.Calendar کے غیر آسان متبادل کے طور پر بنایا تھا۔ Java 8 کے آنے سے پہلے یہ لائبریری صنعتی ترقی میں تاریخوں کے ساتھ کام کرنے کا حقیقی معیار تھی، جس میں Android ایپلیکیشنز بھی شامل ہیں۔ Oracle Java Magazine (2023) کے مطابق، Android API 26 کے آنے کے دو سالوں کے اندر 60% سے زیادہ پروجیکٹس Joda-Time سے java.time پر منتقل ہو گئے۔

اہم نکات

  • Joda-Time — Java 8 میں java.time کا پیش خیمہ، تاریخ اور وقت کے ساتھ کام کرنے کے لیے ایک لائبریری
  • Immutable کلاسز — DateTime, LocalDate, LocalTime, LocalDateTime تھریڈ سیفٹی کو یقینی بناتے ہیں
  • Timezone سپورٹ — خودکار اپ ڈیٹس کے ساتھ بلٹ ان ٹائم زون ڈیٹا بیس
  • منتقلی — java.time (JSR-310) مکمل طور پر Joda-Time کی جگہ لے لیتا ہے، لائبریری کے مصنفین منتقلی کی تجویز کرتے ہیں
  • Android — Joda-Time API 1 سے کام کرتا ہے، لیکن Android 8+ (API 26) کے لیے java.time ترجیح رکھتا ہے

Joda-Time کیا ہے؟

Joda-Time — ایک اوپن سورس لائبریری (Apache 2.0) ہے جو Java زبان میں java.util.Date اور java.util.Calendar کلاسز کا معیاری متبادل فراہم کرتی ہے۔ یہ منصوبہ Stephen Colebourne نے 2004 میں تاریخ کے معیاری APIs کی متعدد مشکلات کے جواب میں قائم کیا تھا، جن میں mutability، فارمیٹنگ کی پیچیدگی اور ٹائم زونز کی محدود سپورٹ شامل ہیں۔ یہ لائبریری Java کمیونٹی میں بڑے پیمانے پر پھیلی اور ہزاروں منصوبوں میں استعمال ہوئی، بشمول بڑے enterprise سسٹمز اور Android ایپلیکیشنز، جہاں تاریخ کے ساتھ کام کرنے کے بلٹ ان ذرائع خاص طور پر غیر آسان تھے۔ 2014 میں Java 8 کے آنے اور java.time (JSR-310) پیکیج کے ظہور کے بعد سے لائبریری کو سپورٹ موڈ میں ڈال دیا گیا — نئی خصوصیات شامل نہیں کی جاتیں، اور موجودہ فعالیت نئے API کے ذریعے مکمل طور پر احاطہ کر لی جاتی ہے۔

لائبریری کا فن تعمیر

Joda-Time immutability کے اصول پر بنائی گئی ہے: تاریخ یا وقت کی ہر شے تخلیق کے بعد تبدیل نہیں کی جا سکتی۔ کوئی بھی عمل — دن کا اضافہ، مہینے کی تبدیلی، ٹائم زون کا تعین — ایک نئی شے لوٹاتا ہے، اصل کو بغیر کسی تبدیلی کے چھوڑ کر۔ یہ طریقہ غلطیوں کی اس کلاس کو مکمل طور پر ختم کرتا ہے جو اشیاء کی غیر ارادی تبدیلی سے منسلک تھیں، جو java.util.Date اور java.util.Calendar کی mutability کی خصوصیت تھیں۔ Immutable ڈیزائن لائبریری کو اضافی synchronization کے بغیر تھریڈ سیف بھی بناتا ہے۔

Joda-Time کے بنیادی کلاسز

لائبریری مختلف منظرناموں کے لیے کئی اہم کلاسز فراہم کرتی ہے: DateTime — ٹائم زون کے ساتھ مکمل تاریخ اور وقت، LocalDate — وقت کے بغیر صرف تاریخ، LocalTime — تاریخ کے بغیر صرف وقت، LocalDateTime — زون سے منسلک کیے بغیر تاریخ اور وقت۔ اس کے علاوہ، وقفوں (Interval)، ادوار (Period) اور مدتوں (Duration) کے ساتھ کام کرنے کے لیے کلاسز شامل ہیں، جو وقت کے دو لمحات کے درمیان فرق کو مختلف اکائیوں میں شمار کرنے کی اجازت دیتی ہیں۔ ہر کلاس یکساں پروسیسنگ کے لیے ReadableInstant یا ReadablePartial انٹرفیس کو لاگو کرتی ہے۔

Joda-Time کے ظہور کی تاریخ

Java میں تاریخ کے معیاری APIs کا مسئلہ پلیٹ فارم کے آغاز سے ہی معروف تھا۔ java.util.Date اور java.util.Calendar کلاسز میں بنیادی خامیاں تھیں: مہینوں کی نمبرنگ 0 سے شروع ہوتی تھی، Date بیک وقت تاریخ اور وقت دونوں کی نمائندگی کرتا تھا، Calendar mutable تھا اور پیچیدہ ترتیب کی ضرورت تھی۔ SimpleDateFormat کے ذریعے فارمیٹنگ تھریڈ سیف نہیں تھی — ملٹی تھریڈ ایپلیکیشنز میں یہ تاریخوں کی غلط پارسنگ کا باعث بنتا تھا۔ Stephen Colebourne، تاریخ کے زیادہ استعمال والے منصوبوں پر کام کرتے ہوئے، ایک متبادل بنانے کا فیصلہ کیا جو ان تمام مسائل کو حل کرے۔

InfoQ (2014) پر انٹرویو کے مطابق، Colebourne نے پہلی عوامی ریلیز سے پہلے Joda-Time کو صنعتی منصوبوں میں ایک سال سے زیادہ آزمایا۔ پہلا ورژن 2004 میں جاری ہوا اور فوری طور پر کمیونٹی کی توجہ حاصل کر لی۔ 2010 تک لائبریری زیادہ تر Java منصوبوں میں ایک معیاری انحصار بن گئی، بشمول Spring اور Hibernate جیسے فریم ورکس۔ Joda-Time کی کامیابی نے براہ راست JSR-310 (Date and Time API) تصریح کو متاثر کیا، جو Java 8 میں شامل کی گئی — اور تصریح کے مصنف وہی Stephen Colebourne تھے۔

Java ایکو سسٹم پر اثر

Joda-Time نے صرف تاریخ کا مسئلہ حل نہیں کیا — اس نے Java میں API ڈیزائن کرنے کے طریقہ کار کو تبدیل کر دیا۔ Immutable value-objects کا تصور، جس کا لائبریری نے مظاہرہ کیا، Java 8 میں تمام نئے APIs کے لیے معیار کے طور پر اپنایا گیا۔ مزید برآں، Joda-Time کی مقبولیت نے Oracle کو دکھایا کہ کمیونٹی ناقص معیاری لائبریریوں کو برداشت کرنے کو تیار نہیں ہے — Joda-Time کے بعد، Java میں فائلوں (NIO.2)، وقت (java.time) اور اختیاری اقدار (Optional) کے ساتھ کام کرنے کے APIs کو دوبارہ ڈیزائن کیا گیا۔

Joda-Time لائبریری کی اہم خصوصیات

Joda-Time خصوصیات کا ایک مجموعہ فراہم کرتی ہے جو Java 8 تک معیاری لائبریری میں دستیاب نہیں تھا۔ اہم فوائد میں 200+ ٹائم زونز کی سپورٹ شامل ہے جس میں ڈے لائٹ سیونگ ٹائم کی خودکار پروسیسنگ، پیٹرن اور لوکیل کے ساتھ فارمیٹنگ کا بھرپور API، اور مختلف اکائیوں — سال، مہینے، دن، گھنٹے — میں تاریخوں کے درمیان ادوار کا حساب شامل ہے۔ خاص توجہ کے مستحق ہیں وقفوں کا نظام: Interval (دو لمحات کے درمیان وقفہ)، Period (کیلنڈر اکائیوں میں فرق) اور Duration (ملی سیکنڈز میں عین مطابق مدت)۔

فارمیٹنگ اور پارسنگ

Joda-Time میں DateTimeFormatter کلاس java.text.SimpleDateFormat کے برعکس تھریڈ سیف تاریخ فارمیٹنگ فراہم کرتی ہے۔ فارمیٹرز کو پیٹرن (مثال کے طور پر، “yyyy-MM-dd HH:mm:ss”) یا اسٹائل (SHORT, MEDIUM, LONG, FULL) کے ذریعے لوکلائزڈ آؤٹ پٹ کے لیے بنایا جا سکتا ہے۔ لائبریری فارمیٹرز کی کیشنگ کو بھی سپورٹ کرتی ہے، جو زیادہ بوجھ والی ایپلیکیشنز میں کام کو تیز کرتی ہے۔ سٹرنگز سے تاریخوں کی پارسنگ سختی کے کنٹرول کے ساتھ کی جاتی ہے — نامکمل یا غلط تاریخوں کی اجازت دی جا سکتی ہے یا نہیں۔

وقفے اور حسابات

Joda-Time کی ایک مضبوط خصوصیت — وقتی وقفوں کے ساتھ کام کرنا۔ Interval کلاس دو لمحات (Instant) کے درمیان عین مطابق وقتی قطعہ پیش کرتی ہے اور تقاطع، اتحاد اور شمولیت کی جانچ کے آپریشنز کو سپورٹ کرتی ہے۔ Period، Interval کے برعکس، کیلنڈر اکائیوں میں کام کرتی ہے — مثال کے طور پر، 1 مارچ اور 1 اپریل کے درمیان فرق بالکل 1 مہینہ ہے، حالانکہ مدت کے لحاظ سے یہ 28–31 دن ہو سکتا ہے۔ Duration کیلنڈر سے منسلک کیے بغیر ملی سیکنڈز میں عین مطابق مدت پیش کرتی ہے اور آپریشنز کے عمل کے وقت کی پیمائش کے لیے موزوں ہے۔

java
import org.joda.time.*;
import org.joda.time.format.*;

DateTime now = new DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String formatted = fmt.print(now);

DateTime nextWeek = now.plusWeeks(1);
Period period = new Period(now, nextWeek);
int days = period.getDays(); // دن = 7

Interval interval = new Interval(now, nextWeek);
boolean contains = interval.contains(now); // سچ

Joda-Time اور java.time کا موازنہ

java.time (JSR-310) پیکیج اسی مصنف — Stephen Colebourne — نے تیار کیا تھا اور اس نے Joda-Time کے بہترین آئیڈیاز کو دس سال کے آپریشنل تجربے کی روشنی میں شامل کیا۔ دونوں APIs immutable کلاسز استعمال کرتے ہیں، ٹائم زونز کو سپورٹ کرتے ہیں اور آپریشنز کا بھرپور مجموعہ فراہم کرتے ہیں۔ تاہم java.time مکمل طور پر Java کی معیاری لائبریری میں ضم ہے، بیرونی انحصار کی ضرورت نہیں ہے اور زیادہ مستقل نام رکھنے کا نظام استعمال کرتا ہے: Instant بجائے ReadableInstant، LocalDate بجائے LocalDate (نام محفوظ ہے)، ZonedDateTime بجائے DateTime۔

خصوصیتJoda-Timejava.time
ریلیز کا سال20042014 (Java 8)
حیثیتسپورٹ (maintenance)فعال ترقی
بنیادی تاریخ/وقتDateTimeZonedDateTime
صرف تاریخLocalDateLocalDate
نا تبدیلی پذیریہاںہاں
فارمیٹنگDateTimeFormatterDateTimeFormatter
تاریخوں کا فرقPeriod / DurationPeriod / Duration

اہم فرق

java.time Joda-Time کے کئی آرکیٹیکچرل فیصلوں کو درست کرتا ہے۔ پہلا، java.time میں null لوٹانے والے اور غیر موجود اقدار کے طریقوں کے درمیان الجھن ختم کر دی گئی ہے — اس کے بجائے Optional استعمال کیا جاتا ہے۔ دوسرا، Chronology انٹرفیس کے ذریعے متبادل کیلنڈر سسٹمز (جاپانی، تھائی، اسلامی) کے لیے سپورٹ شامل کی گئی ہے۔ تیسرا، java.time میں Instant کلاس شامل ہے جو UTC میں کیلنڈر سے منسلک کیے بغیر وقت کے لمحات کے ساتھ کام کرنے کے لیے ہے — یہ نیٹ ورک پروٹوکولز اور ڈیٹا بیسز کے ساتھ انضمام کو آسان بناتا ہے۔ Android کے لیے API 26 (Android 8.0) سے java.time استعمال کرنے کی سفارش کی جاتی ہے یا پرانے ورژنز کے لیے desugaring کے ذریعے۔

Joda-Time سے java.time میں منتقلی

Joda-Time سے java.time میں منتقلی — ایک عمل ہے جسے لائبریری کے مصنفین نے زیادہ سے زیادہ محفوظ اور پیش قیاسی بنانے کی کوشش کی۔ زیادہ تر کلاسز کے براہ راست مماثل ہیں: DateTime → ZonedDateTime, LocalDate → LocalDate (نام مماثل ہے), LocalTime → LocalTime, DateTimeZone → ZoneId, Period → Period, Duration → Duration۔ بنیادی تبدیلیاں اشیاء بنانے کے طریقے اور طریقوں کے ناموں سے متعلق ہیں — مثال کے طور پر، `now.toDate()` کی بجائے `Date.from(instant)` استعمال کیا جاتا ہے، اور `DateTime.now()` کو `ZonedDateTime.now()` سے تبدیل کیا جاتا ہے۔

مرحلہ وار منتقلی کی حکمت عملی

منتقلی شروع کرنے کی سفارش Joda-Time کو ایک پتلے abstraction layer میں الگ کرنے سے کی جاتی ہے — یہ لائبریری کو مرحلہ وار تبدیل کرنے کی اجازت دے گا، بغیر پورے کوڈ بیس کو متاثر کیے۔ پہلے مرحلے میں عام طور پر LocalDate اور LocalTime کے ساتھ کام کو تبدیل کیا جاتا ہے — ان کلاسز میں لائبریریوں کے درمیان کم سے کم فرق ہوتا ہے۔ دوسرے مرحلے میں DateTime (ZonedDateTime میں) اور ٹائم زونز کو منتقل کیا جاتا ہے۔ تیسرے مرحلے میں Interval, Period اور Duration کو تبدیل کیا جاتا ہے — یہاں ڈے لائٹ سیونگ ٹائم کے پیش نظر رویے کو احتیاط سے جانچنا ضروری ہے۔ منتقلی کی تکمیل کے بعد Joda-Time کو منصوبے کے انحصار سے مکمل طور پر ہٹا دیا جاتا ہے۔

kotlin
// Joda-Time (منتقلی سے پہلے)
val dateTime = DateTime.now(DateTimeZone.forID("Europe/Moscow"))
val formatted = dateTime.toString("dd.MM.yyyy")
val plusDay = dateTime.plusDays(1)

// java.time (منتقلی کے بعد)
val zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"))
val formatted2 = zonedDateTime.format(
    DateTimeFormatter.ofPattern("dd.MM.yyyy")
)
val plusDay2 = zonedDateTime.plusDays(1)

منتقلی کے اوزار

Joda-Time سے java.time میں منتقلی کو آسان بنانے والی کئی افادیتیں موجود ہیں۔ OpenRewrite (by Moderne) org.openrewrite.java.migrate.JodaTimeToJavaTime recipe کے ذریعے خودکار منتقلی کو سپورٹ کرتا ہے — یہ کلاسز، طریقوں اور imports کو تبدیل کرتا ہے، پروگرام کی منطق کو محفوظ رکھتے ہوئے۔ Gradle منصوبوں کے لیے de.fayard.refreshVersions پلگ ان بھی منتقلی کے قواعد شامل کرتا ہے۔ دستی طور پر منتقلی IDEA کے ساتھ کرنا سب سے آسان ہے: Java Time Migration Assistant پلگ ان Joda-Time کالز کو نمایاں کرتا ہے اور java.time پر متعلقہ متبادل تجویز کرتا ہے، جو دستی تبدیلی کے مقابلے میں عمل کو 2–3 گنا تیز کرتا ہے۔

Joda-Time پر کوڈ کی مثالیں

Android ایپلیکیشنز میں Joda-Time کے ساتھ کام کرنے کی عملی مثالیں دیکھتے ہیں۔ لائبریری مقامی معیارات کے مطابق تاریخوں کی فارمیٹنگ، صارف کی عمر کا حساب، واقعات کی مدت کا تعین اور دو تاریخوں کے درمیان وقفوں کے حساب کے کاموں کے لیے خاص طور پر مفید ہے۔ تمام مثالیں immutable اشیاء استعمال کرتی ہیں — ہر کال ایک نیا نمونہ لوٹاتی ہے، جبکہ اصل شے غیر تبدیل شدہ رہتی ہے۔

kotlin
// صارف کی عمر کا حساب لگائیں
val birthDate = LocalDate.parse("1990-05-15")
val today = LocalDate.now()
val age = Years.yearsBetween(birthDate, today).getYears()
// عمر == 36

// صارف کے مقام کے مطابق فارمیٹ کریں
val dateTime = DateTime.now()
val formatter = DateTimeFormat.forStyle("MM").withLocale(Locale.getDefault())
val localized = formatter.print(dateTime)

وقفے کے ساتھ کام

Joda-Time میں وقفے وقتی قطعوں کے تقاطع کی جانچ، اوورلیپ کے حساب اور قریب ترین واقعہ کی تلاش کے کاموں کو مؤثر طریقے سے حل کرنے کی اجازت دیتے ہیں۔ مثال کے طور پر، کیلنڈر ایپلیکیشن تیار کرتے وقت یہ جانچا جا سکتا ہے کہ آیا نیا واقعہ پہلے سے موجود واقعات سے ٹکراتا ہے۔ Interval کلاس contains, overlaps, gap اور abuts آپریشنز کو سپورٹ کرتی ہے — آخری دکھاتا ہے کہ آیا وقفے حدوں سے چھوتے ہیں۔ دو لمحات کے درمیان مدت کی پیمائش کے لیے ملی سیکنڈز کی درستگی کے ساتھ Duration استعمال کیا جاتا ہے۔

java
// وقفہ کے اوورلیپ کی جانچ کریں
Interval meeting1 = new Interval(
    new DateTime(2026, 7, 21, 10, 0),
    new DateTime(2026, 7, 21, 11, 0)
);
Interval meeting2 = new Interval(
    new DateTime(2026, 7, 21, 10, 30),
    new DateTime(2026, 7, 21, 11, 30)
);

boolean overlaps = meeting1.overlaps(meeting2); // سچ
Duration gap = meeting1.gap(meeting2); // null (کوئی خلا نہیں)

اکثر پوچھے جانے والے سوالات

Joda-Time کیا ہے اور اس کی ضرورت کیوں ہے؟

Joda-Time — Java میں تاریخ اور وقت کے ساتھ کام کرنے کے لیے ایک لائبریری، جو Java 8 کے آنے سے پہلے بنائی گئی تھی۔ اس نے java.util.Date اور java.util.Calendar کی خامیوں کو دور کیا: mutability، مہینوں کی 0 سے نمبرنگ، ٹائم زونز کی مکمل سپورٹ کی کمی اور non-thread-safe فارمیٹنگ۔

Joda-Time java.time سے کیسے مختلف ہے؟

java.time (JSR-310) — Joda-Time کا جانشین ہے، جو اسی مصنف نے تیار کیا ہے۔ اہم فرق: java.time Java 8+ کی معیاری لائبریری میں ضم ہے، زیادہ مستقل نام رکھنے کا نظام استعمال کرتا ہے، متبادل کیلنڈر سسٹمز کو سپورٹ کرتا ہے اور UTC وقت کے ساتھ کام کرنے کے لیے Instant کلاس شامل کرتا ہے۔

کیا نئے منصوبوں میں Joda-Time استعمال کرنا چاہیے؟

نہیں، نئے منصوبوں کے لیے java.time استعمال کرنے کی سفارش کی جاتی ہے۔ Joda-Time 2014 سے سپورٹ موڈ میں ہے اور مزید نئی خصوصیات حاصل نہیں کرتا۔ Android کے لیے API 26+ پر java.time مقامی طور پر دستیاب ہے، اور پرانے ورژنز کے لیے desugaring استعمال کیا جاتا ہے — ایک طریقہ کار جو API 19+ والے آلات پر java.time استعمال کرنے کی اجازت دیتا ہے۔

Joda-Time کوڈ کو java.time میں کیسے منتقل کریں؟

منتقلی مرحلہ وار کی جاتی ہے: Joda-Time کو abstraction میں الگ کریں، پہلے LocalDate اور LocalTime کو تبدیل کریں، پھر DateTime → ZonedDateTime، اور آخری مرحلے میں Period, Duration اور Interval کو۔ OpenRewrite ٹول JodaTimeToJavaTime recipe کے ذریعے خودکار منتقلی کو سپورٹ کرتا ہے، جو عمل کو 2–3 گنا تیز کرتا ہے۔

Joda-Time کے کون سے کلاسز java.time کے مماثل ہیں؟

DateTime → ZonedDateTime, LocalDate → LocalDate (مماثل), LocalTime → LocalTime, LocalDateTime → LocalDateTime, DateTimeZone → ZoneId, Interval — کا براہ راست مماثل نہیں ہے (Instant + Duration کا مجموعہ استعمال کیا جاتا ہے), Period → Period, Duration → Duration۔ طریقوں کے نام بھی قریب ہیں: plusDays, minusMonths, withZone دونوں لائبریریوں میں دستیاب ہیں۔

خلاصہ

  • Joda-Time — Java کے لیے تاریخ اور وقت کی لائبریری، جو Java 8 کے آنے تک معیار بن گئی اور JSR-310 تصریح پر براہ راست اثر ڈالا
  • Immutable ڈیزائن — Joda-Time کی تمام کلاسز ناقابل تبدیلی ہیں، جو تھریڈ سیفٹی کی ضمانت دیتی ہیں اور اشیاء کی حادثاتی تبدیلی کو روکتی ہیں
  • اہم کلاسز — DateTime, LocalDate, LocalTime, LocalDateTime, Period, Duration اور Interval تاریخ اور وقت کے ساتھ کام کرنے کے تمام منظرناموں کو احاطہ کرتے ہیں
  • ٹائم زون سپورٹ — 200+ زونز کا بلٹ ان ڈیٹا بیس جس میں ڈے لائٹ سیونگ ٹائم کی خودکار پروسیسنگ اور اپ ڈیٹس شامل ہیں
  • java.time پر منتقلی — تمام منصوبوں کے لیے سفارش کی جاتی ہے؛ مرحلہ وار کی جاتی ہے، OpenRewrite ٹولز اور IDE کے بلٹ ان ذرائع کے استعمال کے ساتھ
  • Android مطابقت — Joda-Time API 1 سے کام کرتا ہے، لیکن API 26+ کے لیے java.time ترجیح رکھتا ہے، جو پرانے ورژنز پر desugaring کے ذریعے دستیاب ہے
  • تاریخی اہمیت — Joda-Time نے Java میں API ڈیزائن کرنے کے طریقہ کار کو تبدیل کیا اور کمیونٹی کو immutable value-objects کے فوائد دکھائے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں