TimeZone iOS اور macOS میں ایک Foundation کلاس ہے جو جغرافیائی خطوں کے درمیان درست وقت کی تبدیلی کے لیے ٹائم زون کی معلومات کو خلاصہ کرتی ہے۔ Apple Developer Documentation, 2024 کے مطابق، TimeZone ٹائم زون شناخت کنندگان (IANA Time Zone Database)، UTC سے فرق اور ڈے لائٹ سیونگ ٹائم کے قواعد کے ساتھ کام کرنے کے لیے طریقے فراہم کرتا ہے۔ کلاس DateFormatter اور Calendar کے ساتھ مربوط ہے، جو تاریخوں کو فارمیٹ کرتے وقت درست ٹائم زون کے خودکار اطلاق کو یقینی بناتی ہے۔ دستی فرق حساب کے برعکس، TimeZone ڈیوائس کا ٹائم زون تبدیل ہونے پر خود بخود ڈیٹا اپ ڈیٹ کرتا ہے۔
اہم نکات
TimeZone Swift میں ایک ویلیو ٹائپ ہے جو جغرافیائی ٹائم زون کے بارے میں معلومات فراہم کرتا ہے: UTC فرق، نام، مخفف اور ڈے لائٹ سیونگ ٹائم کے قواعد۔ Objective-C میں، اس کلاس کو NSTimeZone کہا جاتا ہے۔ دونوں کلاسیں IANA Time Zone Database (جسے Olsen ڈیٹابیس بھی کہا جاتا ہے) پر انحصار کرتی ہیں، جس میں 1970 سے ٹائم زون کی تبدیلیوں کی تاریخ شامل ہے۔
ہر TimeZone مثال ایک ٹائم زون شناخت کنندہ (مثلاً Europe/Moscow)، UTC سے موجودہ فرق سیکنڈوں میں، isDaylightSavingTime پرچم اور اگلی منتقلی کی تاریخ ذخیرہ کرتی ہے۔ شناخت کنندہ بنیادی کلید ہے: TimeZone(identifier:) کو ابتدائی شکل دیتے وقت، سسٹم ڈیوائس کے ٹائم زون ڈیٹابیس سے متعلقہ ریکارڈ لوڈ کرتا ہے۔
IANA (2024) کے مطابق، ڈیٹابیس میں 600 سے زیادہ منفرد ٹائم زون شناخت کنندگان ہیں۔ Apple ہر iOS اور macOS ریلیز کے ساتھ اس ڈیٹابیس کا ایک سنیپ شاٹ فراہم کرتا ہے، جو نیٹ ورک کی درخواستوں کی ضرورت کے بغیر تمام آلات پر مستقل حساب کتاب کو یقینی بناتا ہے۔
فن تعمیر Foundation میں TimeZone ایک دو سطحی نظام پر بنایا گیا ہے: ٹائم زون شناخت کنندہ (انسانی پڑھنے کے قابل نام) اور اس کی عددی نمائندگی (UTC فرق)۔ سسٹم خود بخود ڈیوائس کی ترتیبات سے موجودہ ٹائم زون کا انتخاب کرتا ہے، لیکن ڈیولپر مخصوص فارمیٹنگ آپریشنز کے لیے اسے اوور رائڈ کر سکتا ہے۔
TimeZone Calendar اور DateFormatter سے قریب سے جڑا ہوا ہے۔ تاریخ کو فارمیٹ کرتے وقت، DateFormatter وقت میں ایک مطلق لمحے (Date) کو مطلوبہ ٹائم زون میں سٹرنگ نمائندگی میں تبدیل کرنے کے لیے TimeZone مثال کی timeZone پراپرٹی استعمال کرتا ہے۔ اگر timeZone سیٹ نہیں ہے تو، پہلے سے طے شدہ سسٹم ٹائم زون — TimeZone.current استعمال ہوتا ہے۔
| قسم | ابتدائی شکل | خصوصیات |
|---|---|---|
| موجودہ | TimeZone.current | ترتیبات میں علاقہ تبدیل ہونے پر خود بخود اپ ڈیٹ ہوتا ہے، ڈے لائٹ سیونگ ٹائم کو ٹریک کرتا ہے |
| مقرر | TimeZone(identifier:) | ڈیوائس کے علاقے سے آزاد۔ منتخب شناخت کنندہ کو مستقل طور پر لاگو کرتا ہے |
| UTC | TimeZone(secondsFromGMT: 0) | تصحیح کے بغیر ٹائم زون۔ شناخت کنندہ: GMT |
| صوابدیدی فرق | TimeZone(secondsFromGMT: 10800) | سیکنڈوں میں مقرر فرق۔ ڈے لائٹ سیونگ ٹائم کو مدنظر نہیں رکھتا |
اہم نوٹ: TimeZone(identifier:) نامعلوم شناخت کنندگان کے لیے nil لوٹاتا ہے۔ یہ ایپ کریش کی ایک عام وجہ ہے — ڈیولپر صارف کے ان پٹ سے غلط شناخت کنندہ منتقل کرتے وقت اختیاری قدر کو سنبھالنا بھول جاتے ہیں۔ IANA شناخت کنندگان کے لیے، بڑے/چھوٹے حرف اہم ہیں: Europe/Moscow درست ہے، europe/moscow nil لوٹاتا ہے۔
IANA Time Zone Database «علاقہ/شہر» (براعظم/شہر) فارمیٹ استعمال کرتا ہے، جہاں علاقہ براعظموں میں سے ایک ہے (Africa, America, Asia, Atlantic, Australia, Europe, Indian, Pacific) یا ایک سمندر، اور شہر ٹائم زون کے احاطہ کے علاقے میں سب سے زیادہ آبادی والی جگہ ہے۔ یہ فارمیٹ شناخت کنندہ کی انفرادیت اور پڑھنے کی اہلیت کو یقینی بناتا ہے۔
بنیادی فارمیٹ کے علاوہ، TimeZone تین اضافی شناختی طریقوں کو سپورٹ کرتا ہے: مخففات (MSK, EST, PST)، تین حرفی ٹائم زون کوڈز (GMT, UTC) اور عددی فرق (+0300, -0500)۔ تاہم، مخففات مبہم ہیں: EST کا مطلب Eastern Standard Time (GMT-5) یا آسٹریلیا میں Eastern Summer Time (GMT+10) ہو سکتا ہے۔ Apple صرف IANA شناخت کنندگان کے استعمال کی سفارش کرتا ہے۔
import Foundation
// تمام معروف ٹائم زون شناخت کنندگان حاصل کریں
let allIdentifiers: [String] = TimeZone.knownTimeZoneIdentifiers
print("کل ٹائم زونز: \(allIdentifiers.count)")
// علاقے کے مطابق فلٹر کریں
let europeZones = allIdentifiers.filter { $0.hasPrefix("Europe/") }
print("یورپی ٹائم زونز: \(europeZones)")
// مخففات (پروڈکشن کے لیے تجویز نہیں کیے جاتے)
if let moscowTimeZone = TimeZone(abbreviation: "MSK") {
print("GMT سے MSK سیکنڈ: \(moscowTimeZone.secondsFromGMT())")
}
// فرق کے ذریعے شناخت کنندہ تلاش کریں
let utcPlus3 = TimeZone(secondsFromGMT: 10800)
print("شناخت کنندہ: \(utcPlus3.identifier)")
مخففات TimeZone.abbreviationDictionary میں تمام معروف ٹائم زونز کے مخففات ہوتے ہیں، لیکن یہ لغت انفرادیت کی ضمانت نہیں دیتی: PST کلید America/Los_Angeles یا Pacific/Pago_Pago میں سے کسی سے مطابقت رکھ سکتی ہے۔ پروڈکشن کوڈ کے لیے، ہمیشہ IANA شناخت کنندگان استعمال کریں۔
TimeZone ان تمام خطوں کے لیے خود بخود ڈے لائٹ سیونگ ٹائم (DST) کی منتقلی کو مدنظر رکھتا ہے جہاں اس کا مشاہدہ کیا جاتا ہے۔ سسٹم IANA Time Zone Database سے تاریخی ڈیٹا استعمال کرتا ہے، جس میں ہر ٹائم زون کے لیے صحیح منتقلی کی تاریخیں شامل ہیں۔ isDaylightSavingTime پراپرٹی true لوٹاتی ہے اگر ٹائم زون فی الحال ڈے لائٹ سیونگ ٹائم میں ہے۔
nextDaylightSavingTimeTransition طریقہ اگلی منتقلی کی تاریخ جاننے کی اجازت دیتا ہے، جو مستقبل کے واقعات کی منصوبہ بندی کے لیے مفید ہے۔ یہ فعالیت خاص طور پر بار بار DST قاعدہ تبدیلیوں والے خطوں جیسے برازیل یا مراکش کے لیے اہم ہے — 2024 تک، برازیل سالانہ منتقلی کی تاریخیں تبدیل کرتا تھا اور دستی حساب کتاب میں ایپلی کیشنز میں غلطیاں ہوتی تھیں۔
Apple WWDC 2023 کے مطابق، ICU لائبریری (International Components for Unicode)، جو Foundation کی بنیاد ہے، ہر iOS اپ ڈیٹ کے ساتھ DST ڈیٹا کو اپ ڈیٹ کرتی ہے۔ ایپلی کیشنز کو سسٹم اپ ڈیٹ کے بعد ایک دن سے زیادہ ڈے لائٹ سیونگ ٹائم ڈیٹا کیش نہیں کرنا چاہیے — IANA ڈیٹابیس OS ورژن اپ ڈیٹ کے بغیر بھی ٹائم زون ایڈجسٹمنٹ کے ذریعے تبدیل ہو سکتا ہے۔
import Foundation
// Europe/Moscow کے لیے DST چیک کریں
let moscow = TimeZone(identifier: "Europe/Moscow")!
let now = Date()
let isMoscowDST = moscow.isDaylightSavingTime(for: now)
print("ماسکو فی الحال DST میں: \(isMoscowDST)")
// اگلی DST منتقلی کی تاریخ حاصل کریں
if let nextTransition = moscow.nextDaylightSavingTimeTransition(
after: now
) {
let dstOffset = moscow.daylightSavingTimeOffset(
for: nextTransition
)
print("اگلی منتقلی: \(nextTransition), DST فرق: \(dstOffset)s")
}
// DST آگاہی کے ساتھ محفوظ تبدیلی
let newYork = TimeZone(identifier: "America/New_York")!
let offsetNY = newYork.secondsFromGMT(for: now)
print("NY موجودہ فرق: \(offsetNY / 3600)h")
اہم باریک بینی: secondsFromGMT(for:) مخصوص تاریخ کے لیے DST کو مدنظر رکھتا ہے، جبکہ secondsFromGMT() صرف موجودہ وقت پر لاگو ہوتا ہے۔ تاریخی تاریخوں کو فارمیٹ کرتے وقت، ہمیشہ Date پیرامیٹر والے ورژن کا استعمال کریں: secondsFromGMT(for: someHistoricalDate)۔ فرق 1–2 گھنٹے ہو سکتا ہے، جو لاگز یا تاریخی ڈیٹا کے لیے اہم ہے۔
ایک مخصوص ٹائم زون کے ساتھ تاریخ کو فارمیٹ کرنا TimeZone کے ساتھ کام کرتے وقت سب سے عام کام ہے۔ DateFormatter timeZone پراپرٹی کو Date کو سٹرنگ میں تبدیل کرنے کے لیے استعمال کرتا ہے۔ اگر timeZone واضح طور پر سیٹ نہیں ہے تو، فارمیٹر TimeZone.current — صارف کے ڈیوائس پر سیٹ ٹائم زون استعمال کرتا ہے، جو سرور ڈیٹا کے لیے غیر متوقع نتائج کا باعث بن سکتا ہے۔
import Foundation
// مخصوص ٹائم زون میں تاریخ فارمیٹ کریں
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let tokyo = TimeZone(identifier: "Asia/Tokyo")!
formatter.timeZone = tokyo
let tokyoTime = formatter.string(from: Date())
print("ٹوکیو کا وقت: \(tokyoTime)")
// صارف کے انتخاب کے لیے دستیاب شناخت کنندگان
let displayNames: [(String, String)] = TimeZone.knownTimeZoneIdentifiers
.prefix(20)
.map { ($0, TimeZone(identifier: $0)!.localizedName(
for: .generic, locale: .current
)) }
// دو ٹائم زونز کا موازنہ کریں
let london = TimeZone(identifier: "Europe/London")!
let difference = tokyo.secondsFromGMT(for: Date())
- london.secondsFromGMT(for: Date())
print("ٹوکیو-لندن فرق: \(difference / 3600)h")
// مخفف لغت کے ساتھ کام کریں
let knownAbbrevs = TimeZone.abbreviationDictionary
for (abbr, ident) in knownAbbrevs.sorted(by: { $0.key < $1.key }).prefix(5) {
print("\(abbr) -> \(ident)")
}
ٹائم زون کا مقامی نام localizedName(for:locale:) کے ذریعے مخصوص زبان میں انسانی پڑھنے کے قابل نام لوٹاتا ہے۔ مثال کے طور پر، روسی لوکیل کے ساتھ Europe/Moscow کے لیے، طریقہ روسی نام “Moskva” لوٹاتا ہے، اور انگریزی لوکیل کے ساتھ — “Moscow Time”۔ دستیاب اسٹائل: .standard (معیاری نام)، .daylightSaving (ڈے لائٹ سیونگ) اور .shortGeneric (مختصر)۔
import Foundation
let paris = TimeZone(identifier: "Europe/Paris")!
let nameRU = paris.localizedName(
for: .standard,
locale: Locale(identifier: "ru_RU")
)
print("روسی نام: \(nameRU)")
// چیک کریں کہ آیا علاقہ ایک ہی دن میں ہے
let isSameDay = Calendar.current.isDate(
Date(),
equalTo: Date(),
toGranularity: .day
)
print("ٹائم زونز میں ایک ہی دن: \(isSameDay)")
ٹائم زون شناخت کنندہ کی سیریلائزیشن ڈیٹابیسز یا UserDefaults میں TimeZone کو ذخیرہ کرنے کا بہترین طریقہ ہے۔ شناخت کنندہ (Europe/Moscow جیسی سٹرنگ) محفوظ کریں، سیکنڈوں میں فرق یا مخفف نہیں۔ DST تبدیلیوں کے ساتھ فرق تبدیل ہو سکتا ہے اور مخففات مبہم ہیں۔ بحالی: TimeZone(identifier: savedString)۔
ٹائم زون شناخت کنندہ کے بجائے مقرر فرق استعمال کرنا سب سے عام غلطی ہے۔ TimeZone(secondsFromGMT: 10800) DST کو مدنظر نہیں رکھتا، لہذا گرمیوں میں Europe/Moscow کے لیے یہ تعمیر 1 گھنٹے کا غلط فرق دیتی ہے۔ ڈے لائٹ سیونگ ٹائم والے خطوں کے لیے ہمیشہ IANA شناخت کنندہ استعمال کریں۔
TimeZone(identifier:) کو ابتدائی شکل دیتے وقت nil ہینڈلنگ بھولنا دوسری سب سے عام غلطی ہے۔ اگر صارف غلط شناخت کنندہ درج کرتا ہے (مثلاً “Europe/Moscow” کے بجائے “moscow”)، کنسٹرکٹر nil لوٹاتا ہے۔ اختیاری قدر کو سنبھالے بغیر، ایپ رن ٹائم ایرر کے ساتھ کریش ہو جاتی ہے۔ guard let یا معلوم فال بیک کے ساتھ TimeZone(identifier:) استعمال کریں۔
مستقبل کی تاریخوں کے ساتھ کام کرتے وقت DST کو نظرانداز کرنا۔ TimeZone.secondsFromGMT(for:) مخصوص تاریخ کے لیے فرق حاصل کرنے کا واحد صحیح طریقہ ہے۔ تاریخی یا مستقبل کی تاریخوں کے لیے بغیر پیرامیٹر کے secondsFromGMT() استعمال کرنے سے موجودہ لمحے کا فرق ملتا ہے، جو مخصوص تاریخ پر اصل فرق سے مطابقت نہیں رکھتا، خاص طور پر ان خطوں کے لیے جنہوں نے DST کو ختم یا شروع کیا ہے۔
Stack Overflow (2024) کے مطابق، DateFormatter کے تقریباً 15% سوالات غلط timeZone کنفیگریشن سے متعلق ہیں۔ ایک عام منظر نامہ: سرور UTC میں تاریخ بھیجتا ہے، ڈیولپر فارمیٹر کا timeZone سیٹ کیے بغیر اسے فارمیٹ کرتا ہے، اور تاریخ ڈیوائس کے ٹائم زون میں ظاہر ہوتی ہے، جو مختلف خطوں کے صارفین میں الجھن پیدا کرتی ہے۔ قاعدہ: سرور ڈیٹا کے لیے ہمیشہ فارمیٹر کا timeZone واضح طور پر سیٹ کریں۔
اکثر پوچھے گئے سوالات
TimeZone iOS اور macOS میں ٹائم زونز کے ساتھ کام کرنے کے لیے ایک Foundation کلاس ہے۔ یہ UTC فرق، ڈے لائٹ سیونگ ٹائم کے قواعد اور IANA Time Zone Database پر مبنی ٹائم زون شناخت کنندگان کے بارے میں معلومات فراہم کرتا ہے۔
تین فارمیٹس: IANA شناخت کنندگان (Europe/Moscow)، مخففات (MSK, EST) اور عددی فرق (+0300)۔ Apple پروڈکشن کوڈ کے لیے واحد غیر مبہم فارمیٹ کے طور پر IANA شناخت کنندگان استعمال کرنے کی سفارش کرتا ہے۔
خود بخود secondsFromGMT(for:) اور isDaylightSavingTime(for:) طریقوں کے ذریعے۔ TimeZone تاریخی IANA ڈیٹا استعمال کرتا ہے، جو ہر iOS ریلیز کے ساتھ اپ ڈیٹ ہوتا ہے، کسی بھی تاریخ کے لیے درست DST منتقلی کو یقینی بناتا ہے۔
TimeZone.current صارف کی ترتیبات میں منتخب کردہ ٹائم زون لوٹاتا ہے (جغرافیائی سے مختلف ہو سکتا ہے)۔ TimeZone.system ڈیوائس ٹائم زون لوٹاتا ہے، جو خود بخود جغرافیائی محل وقوع سے متعین ہوتا ہے اور صارف کے ذریعے اوور رائڈ نہیں کیا جا سکتا۔
TimeZone.current موجودہ ڈیوائس ٹائم زون لوٹاتا ہے۔ شناخت کنندہ حاصل کرنے کے لیے، identifier پراپرٹی استعمال کریں: TimeZone.current.identifier۔ مقامی نام کے لیے، localizedName(for:locale:) کال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں