TimeZone — এটি কী, Foundation ক্লাস এবং টাইম জোন

লেখক: IT Sectr প্রকাশিত: 2026-07-12 পড়ার সময়: 9 মিনিট

TimeZone হল iOS এবং macOS-এ একটি Foundation ক্লাস যা ভৌগলিক অঞ্চলের মধ্যে সঠিক সময় রূপান্তরের জন্য টাইম জোন তথ্য বিমূর্ত করে। Apple Developer Documentation, 2024 অনুসারে, TimeZone টাইম জোন আইডেন্টিফায়ার (IANA Time Zone Database), UTC থেকে অফসেট এবং ডেলাইট সেভিং টাইম নিয়মের সাথে কাজ করার পদ্ধতি প্রদান করে। ক্লাসটি DateFormatter এবং Calendar-এর সাথে সংহত, যা তারিখ ফর্ম্যাট করার সময় সঠিক টাইম জোনের স্বয়ংক্রিয় প্রয়োগ নিশ্চিত করে। ম্যানুয়াল অফসেট গণনার বিপরীতে, TimeZone ডিভাইসের টাইম জোন পরিবর্তন হলে স্বয়ংক্রিয়ভাবে ডেটা আপডেট করে।

মূল পয়েন্ট

  • TimeZone — iOS এবং macOS-এ টাইম জোন নিয়ে কাজ করার জন্য একটি Foundation ক্লাস
  • IANA Time Zone Database — টাইম জোন আইডেন্টিফায়ারের প্রাথমিক উৎস (America/New_York, Europe/Moscow)
  • স্বয়ংক্রিয় সংশোধন — TimeZone অতিরিক্ত কোড ছাড়াই ডেলাইট সেভিং টাইম পরিচালনা করে
  • DateFormatter-এর সাথে সংহতি — তারিখ ফর্ম্যাট করার সময় টাইম জোন স্বয়ংক্রিয়ভাবে প্রয়োগ হয়
  • তিন প্রকার — স্থানীয় (বর্তমান), নির্দিষ্ট (আইডেন্টিফায়ার দ্বারা নির্ধারিত) এবং UTC

Foundation-এ TimeZone কী?

TimeZone হল Swift-এ একটি ভ্যালু টাইপ যা একটি ভৌগলিক টাইম জোন সম্পর্কে তথ্য প্রদান করে: UTC অফসেট, নাম, সংক্ষিপ্ত রূপ এবং ডেলাইট সেভিং টাইম নিয়ম। Objective-C-এ, ক্লাসটিকে NSTimeZone বলা হয়। উভয় ক্লাসই IANA Time Zone Database (ওলসন ডেটাবেস নামেও পরিচিত) এর উপর নির্ভর করে, যাতে 1970 সাল থেকে টাইম জোন পরিবর্তনের ইতিহাস রয়েছে।

প্রতিটি TimeZone ইনস্ট্যান্স একটি টাইম জোন আইডেন্টিফায়ার (যেমন Europe/Moscow), UTC থেকে বর্তমান অফসেট সেকেন্ডে, isDaylightSavingTime ফ্ল্যাগ এবং পরবর্তী ট্রানজিশনের তারিখ সংরক্ষণ করে। আইডেন্টিফায়ারটি প্রাথমিক কী: TimeZone(identifier:) ইনিশিয়ালাইজ করার সময়, সিস্টেম ডিভাইসের টাইম জোন ডেটাবেস থেকে সংশ্লিষ্ট রেকর্ড লোড করে।

IANA (2024) অনুসারে, ডেটাবেসে 600 টিরও বেশি অনন্য টাইম জোন আইডেন্টিফায়ার রয়েছে। Apple প্রতিটি iOS এবং macOS রিলিজের সাথে এই ডেটাবেসের একটি স্ন্যাপশট প্রদান করে, যা নেটওয়ার্ক অনুরোধের প্রয়োজন ছাড়াই সমস্ত ডিভাইসে ধারাবাহিক গণনা নিশ্চিত করে।

iOS এবং macOS-এ TimeZone কীভাবে কাজ করে?

আর্কিটেকচার Foundation-এ TimeZone একটি দ্বি-স্তরের সিস্টেমের উপর নির্মিত: টাইম জোন আইডেন্টিফায়ার (মানব-পঠনযোগ্য নাম) এবং এর সংখ্যাসূচক উপস্থাপনা (UTC অফসেট)। সিস্টেম স্বয়ংক্রিয়ভাবে ডিভাইস সেটিংস থেকে বর্তমান টাইম জোন নির্বাচন করে, তবে ডেভেলপার নির্দিষ্ট ফর্ম্যাটিং অপারেশনের জন্য এটি ওভাররাইড করতে পারে।

TimeZone Calendar এবং DateFormatter-এর সাথে ঘনিষ্ঠভাবে যুক্ত। একটি তারিখ ফর্ম্যাট করার সময়, DateFormatter সময়ের একটি পরম মুহূর্ত (Date) কে পছন্দসই টাইম জোনে স্ট্রিং উপস্থাপনায় রূপান্তর করতে একটি TimeZone ইনস্ট্যান্সের timeZone প্রপার্টি ব্যবহার করে। যদি timeZone সেট না করা হয়, তাহলে ডিফল্ট সিস্টেম টাইম জোন — TimeZone.current ব্যবহার করা হয়।

TimeZone ইনস্ট্যান্সের প্রকার

প্রকারইনিশিয়ালাইজেশনবৈশিষ্ট্য
বর্তমানTimeZone.currentসেটিংসে অঞ্চল পরিবর্তন হলে স্বয়ংক্রিয়ভাবে আপডেট হয়, ডেলাইট সেভিং টাইম ট্র্যাক করে
নির্দিষ্টTimeZone(identifier:)ডিভাইস অঞ্চল থেকে স্বাধীন। নির্বাচিত আইডেন্টিফায়ার ধারাবাহিকভাবে প্রয়োগ করে
UTCTimeZone(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 আইডেন্টিফায়ার ব্যবহার করার পরামর্শ দেয়।

swift
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

TimeZone স্বয়ংক্রিয়ভাবে সমস্ত অঞ্চলের জন্য ডেলাইট সেভিং টাইম (DST) পরিবর্তনগুলি বিবেচনা করে যেখানে এটি পালন করা হয়। সিস্টেম IANA Time Zone Database থেকে ঐতিহাসিক ডেটা ব্যবহার করে, যাতে প্রতিটি টাইম জোনের জন্য সঠিক ট্রানজিশন তারিখ অন্তর্ভুক্ত থাকে। isDaylightSavingTime প্রপার্টি true ফেরত দেয় যদি টাইম জোন বর্তমানে ডেলাইট সেভিং টাইমে থাকে।

nextDaylightSavingTimeTransition পদ্ধতি পরবর্তী ট্রানজিশনের তারিখ জানতে দেয়, যা ভবিষ্যতের ইভেন্ট পরিকল্পনার জন্য উপযোগী। এই কার্যকারিতা বিশেষ করে ঘন ঘন DST নিয়ম পরিবর্তনযুক্ত অঞ্চলের জন্য গুরুত্বপূর্ণ, যেমন ব্রাজিল বা মরক্কো — 2024 সাল পর্যন্ত, ব্রাজিল বার্ষিক ট্রানজিশন তারিখ পরিবর্তন করত এবং ম্যানুয়াল গণনা অ্যাপ্লিকেশনে ত্রুটি সৃষ্টি করত।

Apple WWDC 2023 অনুসারে, ICU লাইব্রেরি (International Components for Unicode), যা Foundation-এর ভিত্তি, প্রতিটি iOS আপডেটের সাথে DST ডেটা আপডেট করে। অ্যাপ্লিকেশনগুলির সিস্টেম আপডেটের পরে এক দিনের বেশি ডেলাইট সেভিং টাইম ডেটা ক্যাশে করা উচিত নয় — IANA ডেটাবেস OS ভার্সন আপডেট ছাড়াই টাইম জোন সমন্বয়ের মাধ্যমে পরিবর্তিত হতে পারে।

swift
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 ঘন্টা হতে পারে, যা লগ বা ঐতিহাসিক ডেটার জন্য গুরুত্বপূর্ণ।

Swift-এ TimeZone: কোড উদাহরণ

একটি নির্দিষ্ট টাইম জোন সহ তারিখ ফর্ম্যাট করা TimeZone নিয়ে কাজ করার সময় সবচেয়ে সাধারণ কাজ। DateFormatter একটি Date কে স্ট্রিং-এ রূপান্তর করতে timeZone প্রপার্টি ব্যবহার করে। যদি timeZone স্পষ্টভাবে সেট না করা হয়, ফর্ম্যাটার TimeZone.current — ব্যবহারকারীর ডিভাইসে সেট করা টাইম জোন ব্যবহার করে, যা সার্ভার ডেটার জন্য অপ্রত্যাশিত ফলাফল দিতে পারে।

swift
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 (সংক্ষিপ্ত)।

swift
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 নিয়ে কাজ করার সময় সাধারণ ভুল

টাইম জোন আইডেন্টিফায়ারের পরিবর্তে নির্দিষ্ট অফসেট ব্যবহার করা সবচেয়ে সাধারণ ভুল। 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) অনুসারে, প্রায় 15% DateFormatter প্রশ্ন ভুল timeZone কনফিগারেশনের সাথে সম্পর্কিত। একটি সাধারণ পরিস্থিতি: সার্ভার UTC-তে একটি তারিখ পাঠায়, ডেভেলপার ফর্ম্যাটারের timeZone সেট না করেই এটি ফর্ম্যাট করে এবং তারিখটি ডিভাইসের টাইম জোনে প্রদর্শিত হয়, যা বিভিন্ন অঞ্চলের ব্যবহারকারীদের মধ্যে বিভ্রান্তি সৃষ্টি করে। নিয়ম: সার্ভার ডেটার জন্য সর্বদা ফর্ম্যাটারের timeZone স্পষ্টভাবে সেট করুন।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Foundation-এ TimeZone কী?

TimeZone iOS এবং macOS-এ টাইম জোন নিয়ে কাজ করার জন্য একটি Foundation ক্লাস। এটি UTC অফসেট, ডেলাইট সেভিং টাইম নিয়ম এবং IANA Time Zone Database-এর উপর ভিত্তি করে টাইম জোন আইডেন্টিফায়ার সম্পর্কে তথ্য প্রদান করে।

TimeZone কোন আইডেন্টিফায়ার ফরম্যাট সমর্থন করে?

তিনটি ফরম্যাট: IANA আইডেন্টিফায়ার (Europe/Moscow), সংক্ষিপ্ত রূপ (MSK, EST), এবং সংখ্যাসূচক অফসেট (+0300)। Apple প্রোডাকশন কোডের জন্য একমাত্র দ্ব্যর্থহীন ফরম্যাট হিসাবে IANA আইডেন্টিফায়ার ব্যবহার করার পরামর্শ দেয়।

TimeZone কীভাবে ডেলাইট সেভিং টাইম পরিচালনা করে?

স্বয়ংক্রিয়ভাবে secondsFromGMT(for:) এবং isDaylightSavingTime(for:) পদ্ধতির মাধ্যমে। TimeZone ঐতিহাসিক IANA ডেটা ব্যবহার করে, যা প্রতিটি iOS রিলিজের সাথে আপডেট হয়, যে কোনো তারিখের জন্য সঠিক DST ট্রানজিশন নিশ্চিত করে।

TimeZone.current এবং TimeZone.system-এর মধ্যে পার্থক্য কী?

TimeZone.current ব্যবহারকারীর সেটিংসে নির্বাচিত টাইম জোন ফেরত দেয় (ভৌগলিক থেকে ভিন্ন হতে পারে)। TimeZone.system ডিভাইস টাইম জোন ফেরত দেয়, যা স্বয়ংক্রিয়ভাবে ভূ-অবস্থান দ্বারা নির্ধারিত হয় এবং ব্যবহারকারী দ্বারা ওভাররাইড করা যায় না।

Swift-এ বর্তমান টাইম জোন কীভাবে পাবেন?

TimeZone.current বর্তমান ডিভাইস টাইম জোন ফেরত দেয়। আইডেন্টিফায়ার পেতে, identifier প্রপার্টি ব্যবহার করুন: TimeZone.current.identifier। স্থানীয়কৃত নামের জন্য, localizedName(for:locale:) কল করুন।

সারাংশ

  • TimeZone — iOS এবং macOS-এ টাইম জোন নিয়ে কাজ করার জন্য একটি মৌলিক Foundation ক্লাস
  • IANA আইডেন্টিফায়ার — টাইম জোন নির্দিষ্ট করার একমাত্র নির্ভরযোগ্য উপায় (Europe/Moscow, America/New_York)
  • স্বয়ংক্রিয় DST হ্যান্ডলিং — TimeZone secondsFromGMT(for:) এর মাধ্যমে ডেলাইট সেভিং টাইম সঠিকভাবে পরিচালনা করে
  • DateFormatter-এর সাথে সংহতি — বাধ্যতামূলক timeZone সেটিং ভুল তারিখ প্রদর্শন প্রতিরোধ করে
  • স্থানীয়কৃত নাম — localizedName(for:locale:) পদ্ধতি পছন্দসই ভাষায় টাইম জোনের নাম ফেরত দেয়
  • ত্রুটি হ্যান্ডলিং — TimeZone(identifier:) ইনিশিয়ালাইজেশন অবৈধ আইডেন্টিফায়ারের জন্য nil ফেরত দেয়
  • আইডেন্টিফায়ার সংরক্ষণ — সিরিয়ালাইজেশনের জন্য IANA স্ট্রিং সংরক্ষণ করুন, অফসেট বা সংক্ষিপ্ত রূপ নয়

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন