موبائل ڈویلپمنٹ میں تاریخ اور وقت — موبائل انجینئرنگ کے اہم موضوعات میں سے ایک ہے۔ iOS DateFormatter اور ISO8601DateFormatter استعمال کرتا ہے، Android java.time سے DateTimeFormatter اور LocalDate استعمال کرتا ہے۔ Android Developer Docs کے مطابق، تاریخ اور وقت کی فارمیٹنگ کے لیے صحیح موبائل API کا انتخاب مختلف ٹائم زونز میں کارکردگی اور درست ڈسپلے کو براہ راست متاثر کرتا ہے۔
اہم نکات
iOS پر، تاریخ اور وقت روایتی طور پر Foundation کے DateFormatter کے ذریعے فارمیٹ کیے جاتے ہیں۔ یہ کلاس متعین پیٹرن، لوکیل اور ٹائم زون کا استعمال کرتے ہوئے Date کو سٹرنگ میں اور واپس تبدیل کرتی ہے۔ DateFormatter کا بنیادی مسئلہ — یہ تھریڈ سیف نہیں ہے اور آہستہ بنتا ہے، لہٰذا موبائل کوڈ میں انسٹینسز کو لازمی طور پر کیشے کرنا چاہیے۔ iOS پر موبائل ڈویلپمنٹ میں تاریخ کو صحیح فارمیٹر کی ضرورت ہوتی ہے۔
DateFormatter بنانے میں تقریباً 1 ملی سیکنڈ لگتا ہے کیونکہ dateFormat پیٹرن کو پارس کرنا، لوکیل لوڈ کرنا اور ٹائم زون کا تعین کرنا ہوتا ہے۔ سینکڑوں تاریخوں کی فہرست کو فارمیٹ کرتے وقت، بار بار بنانے سے UI میں نمایاں تاخیر ہوتی ہے۔ حل — پوری اسکرین کے لیے ایک بار فارمیٹر بنائیں اور دوبارہ استعمال کریں۔ ملٹی تھریڈڈ رسائی کے لیے DispatchQueue کے ذریعے مطابقت پذیری استعمال کریں۔
import Foundation
// کیشے شدہ DateFormatter — ایک بار بنایا جاتا ہے
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy HH:mm"
formatter.locale = Locale(identifier: "ru_RU")
formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
return formatter
}()
// ISO8601DateFormatter — ہلکا متبادل
private let isoFormatter: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
return formatter
}()
let now = Date()
let formattedDate = dateFormatter.string(from: now)
// "01.07.2026 14:30"
let isoDate = isoFormatter.string(from: now)
// "2026-07-01T14:30:00.000Z"
ISO 8601 فارمیٹ کے لیے، ISO8601DateFormatter استعمال کریں — اسے پیٹرن بتانے کی ضرورت نہیں اور یہ DateFormatter سے تیزی سے کام کرتا ہے۔ iOS 10+ پر، یہ کلاس سرور کی تاریخوں کے ساتھ کام کرنے کے لیے ترجیحی ہے۔ پرانے فارمیٹس کے لیے DateFormatter رکھیں لیکن انسٹینس کو بطور سٹیٹک پراپرٹی یا سنگلٹن کیشے کرنا یقینی بنائیں۔
Android پر، تاریخ اور وقت java.time پیکیج کے ذریعے پروسیس کیا جاتا ہے، جو API 26 سے دستیاب ہے۔ اہم کلاسیں: LocalDate (صرف تاریخ)، LocalTime (صرف وقت)، LocalDateTime (ٹائم زون کے بغیر تاریخ اور وقت) اور ZonedDateTime (ٹائم زون کے ساتھ)۔ DateTimeFormatter — Android موبائل پلیٹ فارم کے لیے تھریڈ سیف فارمیٹر۔ موبائل ایپلیکیشنز میں تاریخ کارکردگی کے نقصان کے بغیر DateTimeFormatter اور LocalDate کے ذریعے فارمیٹ کی جاتی ہے۔
LocalDate وقت کے بغیر تاریخ محفوظ کرتا ہے — سالگرہ کے لیے مثالی۔ ZonedDateTime ٹائم زون کے ساتھ مکمل معلومات محفوظ کرتا ہے۔ DateTimeFormatter پہلے سے طے شدہ پیٹرن (ISO_LOCAL_DATE، ISO_DATE_TIME) اور ofPattern کے ذریعے کسٹم پیٹرن کو سپورٹ کرتا ہے۔ تمام java.time کلاسیں ناقابل تبدیل اور تھریڈ سیف ہیں، جو متعدد تھریڈز میں کام کرتے وقت ریس کنڈیشن کو ختم کرتی ہیں۔
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.ZoneId
// موجودہ تاریخ بنانا اور فارمیٹ کرنا
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)
// ٹائم زونز کے ساتھ کام کرنا
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))
DateTimeFormatter SimpleDateFormat سے نمایاں طور پر زیادہ موثر ہے کیونکہ یہ ہر کال پر پیٹرن کو پارس نہیں کرتا۔ فارمیٹر کنسٹنٹس کو کلاس یا کمپینین آبجیکٹ کی سطح پر بنانے کی سفارش کی جاتی ہے۔ Unix Timestamp کو تبدیل کرنے کے لیے، Instant.ofEpochSecond استعمال کریں، پھر ٹائم زون کے ذریعے LocalDateTime یا ZonedDateTime میں تبدیل کریں۔
صارف کی اسکرین پر درست تاریخ اور وقت کا انحصار ٹائم زونز کی مناسب پروسیسنگ پر ہے۔ Android کے لیے موبائل ڈویلپمنٹ میں تاریخ اور وقت کے لیے ڈیوائس کے ٹائم زون پر غور کرنا ضروری ہے۔ سنہری اصول: وقت UTC میں محفوظ کریں، صرف ڈسپلے کے لیے مقامی ٹائم زون میں تبدیل کریں۔ iOS Foundation سے TimeZone فراہم کرتا ہے، Android java.time سے ZoneId فراہم کرتا ہے۔ موبائل پلیٹ فارمز کے لیے دونوں APIs ڈیوائس کے موجودہ ٹائم زون کا خودکار پتہ لگانے کی حمایت کرتے ہیں۔ موبائل ایپلیکیشن میں تاریخ ZoneId اور TimeZone پر منحصر ہے۔
ڈے لائٹ سیونگ ٹائم ابہام پیدا کرتا ہے: وقت میں ایک لمحہ دو مختلف مقامی گھڑیوں سے ظاہر کیا جا سکتا ہے۔ java.time اور Foundation خود بخود DST کو ہینڈل کرتے ہیں۔ IANA شناخت کنندگان (Europe/Moscow، America/New_York) استعمال کریں، مخففات (MSK، EST) نہیں — مخففات مبہم ہیں اور ڈے لائٹ سیونگ ٹائم کی تبدیلی کو نظر انداز کرتے ہیں۔
import Foundation
// UTC کو iOS پر مقامی وقت میں تبدیل کرنا
func formatToLocalTime(utcDate: Date, timeZoneId: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy HH:mm"
formatter.timeZone = TimeZone(identifier: timeZoneId)
return formatter.string(from: utcDate)
}
// ڈیوائس کا ٹائم زون متعین کرنا
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()
Android پر، ڈیوائس کا ٹائم زون حاصل کرنے کے لیے ZoneId.systemDefault() استعمال کریں۔ UTC کو مقامی وقت میں تبدیل کرتے وقت، ZoneOffset.UTC کے ساتھ ZonedDateTime بنائیں اور withZoneSameInstant لگائیں۔ java.time کے بغیر پرانی APIs کے لیے، TimeZone.getDefault() اور Calendar استعمال کریں — لیکن براہ راست ThreeTenABP شامل کرنا بہتر ہے۔
import java.time.Instant
import java.time.ZonedDateTime
import java.time.ZoneId
// Unix Timestamp کو مقامی وقت میں تبدیل کریں
fun toLocalDisplay(unixSeconds: Long): String {
val instant = Instant.ofEpochSecond(unixSeconds)
val local = instant.atZone(ZoneId.systemDefault())
return local.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"))
}
ThreeTenABP — ایک اڈاپٹر لائبریری جو java.time کو Android API 26 سے نیچے پورٹ کرتی ہے۔ یہ وہی کلاسیں فراہم کرتی ہے: LocalDate، LocalTime، ZonedDateTime، DateTimeFormatter، Instant۔ اگر ایپلیکیشن Android 5 یا 6 (API 21-25) کو سپورٹ کرتی ہے، تو ThreeTenABP متروک Calendar پر سوئچ کیے بغیر جدید موبائل API استعمال کرنے کا واحد طریقہ ہے۔ پرانے آلات کے لیے موبائل ڈویلپمنٹ میں تاریخ اور وقت اس لائبریری کے ذریعے لاگو کیا جاتا ہے۔ پرانے آلات کے لیے، تاریخ اور وقت ThreeTenABP کے ذریعے لاگو کیا جاتا ہے۔
لائبریری کو Application.onCreate() طریقہ میں AndroidThreeTen.init() کال کرکے ابتدا کی ضرورت ہوتی ہے۔ یہ assets سے ٹائم زون کا ڈیٹا لوڈ کرتا ہے۔ ابتدا کے بعد، API مکمل طور پر java.time سے ملتا جلتا ہے — API 26+ اور API 21+ کے لیے کوڈ ایک جیسا ہوگا۔ لائبریری کا سائز تقریباً 400 KB ہے، جو زیادہ تر موبائل ایپلیکیشنز کے لیے قابل قبول ہے۔
import org.threeten.bp.LocalDate
import org.threeten.bp.format.DateTimeFormatter
// Application میں ابتدا
class App : Application() {
override fun onCreate() {
super.onCreate()
AndroidThreeTen.init(this)
}
}
// API java.time سے ملتا جلتا ہے
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)
جدید آلات پر ThreeTenABP کی کارکردگی اصل java.time کے برابر ہے۔ پرانے آلات پر، ٹائم زون ڈیٹا لوڈ ہونے کی وجہ سے پہلی کال میں تاخیر ہو سکتی ہے۔ موجودہ کوڈ کو Calendar سے ThreeTenABP میں بتدریج منتقل کریں: نئے ماڈیولز میں Date اور Calendar کو Instant اور LocalDate سے بدلیں، پرانا کوڈ تبدیل کیے بغیر چھوڑ دیں۔
Unix Timestamp — 1 جنوری 1970 00:00 UTC سے گزرے سیکنڈوں کی تعداد۔ یہ سرور اور کلائنٹ کے درمیان وقت کو محفوظ کرنے اور تبادلہ کرنے کے لیے ایک عالمی فارمیٹ ہے۔ تاہم، صارف کی ترتیبات کی وجہ سے ڈیوائس پر وقت حقیقی وقت سے مختلف ہو سکتا ہے۔ مطابقت پذیری کے لیے NTP استعمال کیا جاتا ہے — UDP پر عین وقت کا پروٹوکول۔ Unix Timestamp وہ فارمیٹ ہے جس میں سرور پر تاریخ اور وقت محفوظ کیا جاتا ہے۔
iOS پر Date().timeIntervalSince1970 1970 سے سیکنڈ لوٹاتا ہے۔ Android پر System.currentTimeMillis() ملی سیکنڈ لوٹاتا ہے۔ درستگی کے لیے NTP استعمال کریں: iOS کے لیے TrueTime لائبریری اور Android کے لیے AndroidNtp NTP سرور کو درخواست بھیجتی ہیں اور وقت کے فرق کا حساب لگاتی ہیں۔ NTP کی درستگی مقامی نیٹ ورک پر 1-10 ms اور انٹرنیٹ کے ذریعے 10-100 ms ہے۔
import Foundation
// iOS پر Unix Timestamp حاصل کرنا
let seconds = Date().timeIntervalSince1970
let milliseconds = Int64(seconds * 1000)
// TrueTime کے ساتھ NTP مطابقت پذیری
TrueTime.shared.start { result in
switch result {
case .success:
let ntpTime = TrueTime.shared.now()
print("عین وقت: \(ntpTime)")
case .failure(let error):
print("NTP خرابی: \(error)")
}
}
موبائل ایپلیکیشن میں مطابقت پذیری کے بغیر غلطیاں ممکن ہیں: غلط ایونٹ ٹائم اسٹیمپ، سرور کے ساتھ ڈی سنکرونائزیشن۔ موبائل ڈویلپمنٹ میں وقت ایپلیکیشن شروع ہونے پر ایک بار NTP کے ذریعے مطابقت پذیر کیا جاتا ہے، جس کے بعد حسابی فرق استعمال کیا جاتا ہے۔ درستگی کے لیے اہم موبائل ایپلیکیشنز (فنانس، لاجسٹکس) کے لیے، سرور کو ڈیٹا بھیجنے سے پہلے NTP پروٹوکول لازمی ہے۔
اکثر پوچھے گئے سوالات
DateFormatter ہر بار جب انسٹینس بنائی جاتی ہے فارمیٹنگ پیٹرن کو پارس کرتا ہے، لوکیل لوڈ کرتا ہے اور ٹائم زون کا تعین کرتا ہے۔ فارمیٹر کو بطور سٹیٹک کنسٹنٹ کیشے کریں یا ISO 8601 کے لیے ISO8601DateFormatter استعمال کریں — یہ ہلکا اور تیز ہے۔
java.time پیکیج سے DateTimeFormatter — تھریڈ سیف اور موثر۔ API 26 سے دستیاب ہے۔ پرانے ورژنز کے لیے ThreeTenABP استعمال کریں جو ایک جیسی API فراہم کرتا ہے۔
ThreeTenABP شامل کریں — Android API 21+ کے لیے java.time کا بیک پورٹ۔ Application.onCreate() میں AndroidThreeTen.init() کے ذریعے ابتدا کریں۔ API اصل java.time سے مکمل طور پر ملتا جلتا ہے۔
ہاں، سرور اور مقامی ڈیٹا بیس میں وقت UTC میں محفوظ کریں۔ صرف ڈسپلے کے مرحلے پر صارف کے مقامی ٹائم زون میں تبدیل کریں۔ اس سے ٹائم زون تبدیل کرنے یا سفر کرنے پر غلطیاں ختم ہو جاتی ہیں۔
Date().timeIntervalSince1970 1 جنوری 1970 سے سیکنڈوں کی تعداد لوٹاتا ہے۔ ملی سیکنڈ کے لیے 1000 سے ضرب دیں اور Int64 میں تبدیل کریں۔ عین مطابقت پذیری کے لیے NTP سرور کے ساتھ TrueTime لائبریری استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔