DateFormatter হল একটি Foundation ক্লাস যা Date অবজেক্ট এবং তাদের স্ট্রিং উপস্থাপনের মধ্যে দ্বিমুখী রূপান্তরের জন্য ডিজাইন করা হয়েছে। ক্লাসটি ব্যবহারকারীর লোকেল, সময় অঞ্চল এবং ক্যালেন্ডার বিবেচনা করে, বিশ্বের যেকোনো অঞ্চলে তারিখের সঠিক প্রদর্শন নিশ্চিত করে। Apple Developer Documentation (2025) অনুসারে, DateFormatter চারটি পূর্বনির্ধারিত তারিখ এবং সময় স্টাইল সমর্থন করে, পাশাপাশি একটি টেমপ্লেট স্ট্রিংয়ের মাধ্যমে সম্পূর্ণ কাস্টম ফর্ম্যাটও সমর্থন করে। DateFormatter ছাড়া একটি আন্তর্জাতিকীকৃত অ্যাপ্লিকেশনে ব্যবহারকারীকে সঠিকভাবে তারিখ প্রদর্শন করা অসম্ভব।
মূল বিষয়
DateFormatter হল Foundation ফ্রেমওয়ার্কের একটি ক্লাস যা Date এবং স্ট্রিং-এর মধ্যে দ্বিমুখী রূপান্তর বাস্তবায়ন করে। এটি প্রথম OpenStep-এ NSDateFormatter হিসেবে আবির্ভূত হয় এবং তারপর থেকে সমস্ত Apple প্ল্যাটফর্মে তারিখ ফর্ম্যাটিংয়ের প্রাথমিক টুল হিসেবে রয়ে গেছে। ক্লাসটি Formatter থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং স্থানীয়কৃত তারিখ প্রদর্শনের জন্য একটি সুবিধাজনক API প্রদান করে।
DateFormatter Unicode LDML প্যাটার্নের ভিত্তিতে কাজ করে — যেগুলি ICU (International Components for Unicode)-তে ব্যবহৃত হয়। প্যাটার্নটি dateFormat বৈশিষ্ট্যের মাধ্যমে সেট করা হয়, যেখানে চিহ্ন y, M, d, H, m, s বছর, মাস, দিন, ঘন্টা, মিনিট, সেকেন্ডের সাথে সম্পর্কিত। একটি চিহ্নের পুনরাবৃত্তি ফর্ম্যাট নির্ধারণ করে: "y" — দুই অঙ্কের বছর, "yyyy" — চার অঙ্কের বছর।
DateFormatter তৈরি করা একটি ব্যয়বহুল অপারেশন, কারণ আরম্ভের সময় লোকেল এবং ক্যালেন্ডার ডেটা লোড হয়। Apple প্রতিটি ফর্ম্যাটিং ধরনের জন্য একবার ফর্ম্যাটার তৈরি এবং পুনরায় ব্যবহার করার পরামর্শ দেয়। SwiftUI এবং UIKit-এ, ফর্ম্যাটারগুলি প্রায়ই স্ট্যাটিক বৈশিষ্ট্যে ক্যাশ করা হয় বা প্রথম অ্যাক্সেসে লেজিলি তৈরি করা হয়।
DateFormatter অনেক iOS সিস্টেম কম্পোনেন্টে ব্যবহৃত হয়। UIDatePicker countDownTimer মোডে তারিখ প্রদর্শনের জন্য অভ্যন্তরীণভাবে DateFormatter ব্যবহার করে। একটি ফর্ম্যাটার সহ TextField স্বয়ংক্রিয়ভাবে ব্যবহারকারীর প্রবেশ করা তারিখগুলি বৈধতা দিতে পারে। Core Data Date টাইপের অ্যাট্রিবিউট সমর্থন করে, কিন্তু তাদের স্ট্রিং উপস্থাপনা সর্বদা DateFormatter-এর মাধ্যমে পরিচালিত হয়।
থ্রেড নিরাপত্তা — DateFormatter থ্রেড-নিরাপদ নয়। বিভিন্ন থ্রেড থেকে ফর্ম্যাটারের বৈশিষ্ট্য পরিবর্তন করা অনির্ধারিত আচরণের দিকে নিয়ে যায়। মাল্টি-থ্রেডেড ব্যবহারের জন্য, প্রতিটি থ্রেডের জন্য আলাদা ফর্ম্যাটার ইনস্ট্যান্স তৈরি করুন বা NSLock বা সিরিয়াল কিউ-এর মাধ্যমে সিঙ্ক্রোনাইজেশন ব্যবহার করুন।
dateStyle এবং timeStyle তারিখ প্রদর্শন কনফিগার করার সবচেয়ে সহজ উপায়। প্রতিটি স্টাইলের চারটি ভেরিয়েন্ট রয়েছে: .short, .medium, .long, .full। dateStyle এবং timeStyle-এর সংমিশ্রণ তারিখ এবং সময় ফর্ম্যাটের স্বাধীন কনফিগারেশনের অনুমতি দেয়, এবং .none বৈশিষ্ট্য সংশ্লিষ্ট অংশটি নিষ্ক্রিয় করে।
মার্কিন লোকেলের জন্য, .short তারিখটি "7/21/26" হিসেবে ফর্ম্যাট করে এবং রুশ লোকেলের জন্য "21.07.2026" হিসেবে। রুশ লোকেলের জন্য .long স্টাইল "21 জুলাই 2026" আউটপুট করে, এবং .full — "মঙ্গলবার, 21 জুলাই 2026" সপ্তাহের দিন সহ। চারটি স্টাইলই স্বয়ংক্রিয়ভাবে আঞ্চলিক মানগুলির সাথে খাপ খায়, যার মধ্যে উপাদানের ক্রম এবং বিভাজক অন্তর্ভুক্ত।
SFDateFormatter iOS 15+-এ RelativeDateFormatter এবং DateIntervalFormatter-এর মাধ্যমে একটি বিকল্প পদ্ধতি প্রদান করে। RelativeDateFormatter প্রাসঙ্গিক প্রদর্শনের জন্য "আজ", "গতকাল", "3 দিনের মধ্যে" আউটপুট করে। DateIntervalFormatter তারিখের পরিসর প্রদর্শন করে: "21–25 জুলাই 2026" — বুকিং এবং পরিকল্পনার জন্য।
| স্টাইল | উদাহরণ (ru_RU) | উদাহরণ (en_US) |
|---|---|---|
| .short | 21.07.2026 | 7/21/26 |
| .medium | 21 জুলা 2026 | Jul 21, 2026 |
| .long | 21 জুলাই 2026 | July 21, 2026 |
| .full | মঙ্গলবার, 21 জুলাই 2026 | Tuesday, July 21, 2026 |
স্টাইলগুলি একত্রিত করার সময়, DateFormatter স্বয়ংক্রিয়ভাবে বিভাজক নির্বাচন করে: .short.date + .short.time-এর জন্য ফলাফল "21.07.2026, 14:30" হতে পারে। .full.date + .full.time-এর জন্য — "মঙ্গলবার, 21 জুলাই 2026, 14:30:00 MSK"। বিভাজক লোকেল দ্বারা পরিচালিত হয়, ডেভেলপার দ্বারা নয় — এটি ব্যবহারকারীর আঞ্চলিক প্রত্যাশার সাথে সম্মতি নিশ্চিত করে।
dateFormat Unicode LDML স্পেসিফিকেশন চিহ্ন ব্যবহার করে একটি নির্বিচারে ফর্ম্যাটিং প্যাটার্ন সেট করার অনুমতি দেয়। এটি প্রদর্শনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়: আপনি শুধুমাত্র বছর এবং মাস দেখাতে পারেন, বা তারিখ ছাড়া সপ্তাহের দিন, বা সেকেন্ড ছাড়া সময়। কাস্টম ফর্ম্যাট নির্দিষ্ট ডিজাইনের প্রয়োজনীয়তার জন্য অপরিহার্য।
মূল চিহ্ন — yyyy (বছর: 2026), MM (মাস: 07), dd (দিন: 21), HH (ঘন্টা: 14), mm (মিনিট: 30), ss (সেকেন্ড: 00)। পূর্ণ মাসের নামের জন্য MMMM (জুলাই) ব্যবহার করুন, সংক্ষিপ্তের জন্য — MMM (জুলা)। সপ্তাহের দিন — EEEE (মঙ্গলবার), সংক্ষিপ্ত — E (মঙ্গল)।
dateFormat ব্যবহার করার সময় ফর্ম্যাটারের লোকেল সেট করা গুরুত্বপূর্ণ। যদি লোকেল সেট না করা হয়, ফর্ম্যাটার সিস্টেম লোকেল ব্যবহার করে, যা API-তে একটি নির্দিষ্ট ফর্ম্যাটের জন্য অবাঞ্ছিত হতে পারে। Apple একটি নির্দিষ্ট আন্তঃআঞ্চলিক ফর্ম্যাটের জন্য locale = Locale(identifier: "en_US_POSIX") সেট করার পরামর্শ দেয়, বিশেষ করে সার্ভার প্রতিক্রিয়া থেকে তারিখ পার্স করার সময়।
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.dateFormat = "d MMMM yyyy"
let customString = formatter.string(from: Date())
// "21 July 2026"
// কাস্টম স্ট্রিং পার্স করা
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = formatter.date(from: "2026-07-21 14:30:00")!
dateFormat-এ ত্রুটি অ্যাপ্লিকেশন ক্র্যাশের সাধারণ কারণগুলির মধ্যে একটি। যদি ফর্ম্যাট স্ট্রিংয়ের সাথে মেলে না, date(from:) মেথড nil ফেরত দেয়। নিরাপদ অপশনাল আনর্যাপিংয়ের জন্য guard let বা ?? ব্যবহার করুন। ফর্ম্যাট বৈধতা দেওয়ার জন্য, এটি সমর্থিত সব ভাষায় পরীক্ষা করুন — কিছু LDML চিহ্ন বিভিন্ন লোকেলে ভিন্নভাবে কাজ করে।
Locale নির্ধারণ করে কিভাবে মাসের নাম, সপ্তাহের দিনের নাম এবং বিভাজক প্রদর্শিত হয়। DateFormatter ডিফল্টরূপে Locale.current ব্যবহার করে, কিন্তু কিছু পরিস্থিতিতে একটি নির্দিষ্ট লোকেল নির্দিষ্ট করা প্রয়োজন: লগে নির্দিষ্ট ফর্ম্যাটের জন্য en_US_POSIX ব্যবহার করুন, সার্ভারের তারিখের জন্য — সার্ভারের সাথে মেলে এমন লোকেল।
TimeZone বৈশিষ্ট্য প্রদর্শনের জন্য সময় অঞ্চল নির্ধারণ করে। ডিফল্টরূপে সিস্টেম সময় অঞ্চল ব্যবহার করা হয়, কিন্তু আন্তর্জাতিক শ্রোতাদের সাথে অ্যাপ্লিকেশনের জন্য প্রায়ই ব্যবহারকারীর সময় অঞ্চল বা UTC-তে তারিখ প্রদর্শন করা প্রয়োজন। timeZone পরিবর্তন শুধুমাত্র প্রদর্শনকে প্রভাবিত করে — Date মান অপরিবর্তিত থাকে।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য: যদি DateFormatter একটি স্ট্রিং পার্স করার জন্য ব্যবহার করা হয় এবং স্ট্রিংটিতে সময় অঞ্চল নির্দেশ থাকে (উদাহরণস্বরূপ, UTC-এর জন্য Z সহ "2026-07-21T14:30:00Z"), তাহলে timeZone বৈশিষ্ট্য উপেক্ষা করা হয় — ফর্ম্যাটার স্ট্রিং থেকে সময় অঞ্চল ব্যবহার করে। যদি স্ট্রিংটিতে সময় অঞ্চল অনুপস্থিত থাকে, তাহলে ফর্ম্যাটারের timeZone প্রয়োগ করা হয়।
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
formatter.dateStyle = .long
formatter.timeStyle = .short
let moscowTime = formatter.string(from: Date())
// "21 July 2026, 14:30"
// স্ট্রিংয়ে সময় অঞ্চল ছাড়া পার্স করা
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let utcDate = formatter.date(from: "2026-07-21 10:30")!
AutoupdatingCurrentLocale — একটি বিশেষ লোকেল টাইপ যা ব্যবহারকারীর সিস্টেম সেটিংস পরিবর্তন হলে স্বয়ংক্রিয়ভাবে আপডেট হয়। DateFormatter ডিফল্টরূপে এটি সমর্থন করে। যদি অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে চলাকালীন ব্যবহারকারী সিস্টেম ভাষা পরিবর্তন করে, পরিবর্তনের আগে তৈরি ফর্ম্যাটার পুরানো লোকেল ব্যবহার করতে থাকবে — আপডেট করার জন্য একটি নতুন ইনস্ট্যান্স তৈরি করতে হবে।
ISO8601DateFormatter হল ISO 8601 ফর্ম্যাটে তারিখ নিয়ে কাজ করার জন্য একটি বিশেষায়িত ফর্ম্যাটার। এই ফর্ম্যাটটি REST API, JSON এবং ডেটা বিনিময়ের জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড। ISO8601DateFormatter DateFormatter-এর তুলনায় উল্লেখযোগ্যভাবে দ্রুত কাজ করে কারণ এটি লোকেলের উপর নির্ভর করে না এবং একটি নির্দিষ্ট পার্সিং গ্রামার ব্যবহার করে।
মূল ফর্ম্যাটার অপশন — .withInternetDateTime (2026-07-21T14:30:00Z), .withFractionalSeconds (মিলিসেকেন্ড যোগ করে), .withTimeZone (সময় অঞ্চল অফসেট অন্তর্ভুক্ত করে)। অপশনগুলি একত্রিত করে আপনি যেকোনো ISO 8601 ভেরিয়েন্ট পেতে পারেন: মিলিসেকেন্ড সহ, সময় অঞ্চল সহ, শুধুমাত্র তারিখ সহ।
JSONEncoder.DateEncodingStrategy সমস্ত Codable মডেলের জন্য বিশ্বব্যাপী তারিখ এনকোডিং কনফিগার করার অনুমতি দেয়। অপশন — .iso8601 (ISO8601DateFormatter ব্যবহার করে), .formatted(DateFormatter), .millisecondsSince1970, .secondsSince1970। কৌশলের পছন্দ সম্পূর্ণ সিরিয়ালাইজেশন লাইফসাইকেলকে প্রভাবিত করে এবং সমস্ত API এন্ডপয়েন্ট জুড়ে সামঞ্জস্যপূর্ণ হওয়া উচিত।
// ISO8601DateFormatter
let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let isoString = isoFormatter.string(from: Date())
// "2026-07-21T14:30:00.000Z"
// ISO8601 সহ JSONEncoder
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
// বিকল্প: কাস্টম ফর্ম্যাটার সহ JSONEncoder
let customEncoder = JSONEncoder()
customEncoder.dateEncodingStrategy = .formatted(myFormatter)
DateFormatter বনাম ISO8601DateFormatter — API-তে তারিখ সিরিয়ালাইজ এবং পার্স করার জন্য ISO8601DateFormatter বেছে নিন, কারণ এটি DateFormatter-এর থেকে 5-10 গুণ দ্রুত এবং স্থানীয়করণ ত্রুটির জন্য প্রবণ নয়। DateFormatter ব্যবহারকারী ইন্টারফেসের জন্য ছেড়ে দিন যেখানে ব্যবহারকারীর মাতৃভাষায় মাস এবং দিনের নাম সহ স্থানীয়কৃত প্রদর্শন প্রয়োজন।
আসুন iOS অ্যাপ্লিকেশনে DateFormatter-এর ব্যবহারের বাস্তব পরিস্থিতি দেখি: নিউজ ফিডে তারিখ প্রদর্শন, জন্ম তারিখ প্রবেশ করানো এবং বিভিন্ন সময় অঞ্চলে তারিখ সহ রিপোর্ট রপ্তানি।
RelativeDateFormatter নিউজ ফিডের জন্য সর্বোত্তম। এটি তাজা খবরের জন্য "এইমাত্র", "5 মিনিট আগে", "গতকাল" প্রদর্শন করে এবং পুরানো খবরের জন্য পূর্ণ তারিখে স্যুইচ করে। স্যুইচ থ্রেশহোল্ড ক্যালেন্ডারের মাধ্যমে কনফিগার করা হয়: খবরের জন্য 24 ঘন্টার সীমা ব্যবহার করুন, মেসেঞ্জারের জন্য — এক সপ্তাহ।
func formatRelativeDate(_ date: Date) -> String {
let relative = RelativeDateFormatter()
relative.unitsStyle = .full
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let daysDiff = Calendar.current.dateComponents(
[.day], from: date, to: Date()
).day ?? 0
return daysDiff < 1
? relative.localizedString(for: date, relativeTo: Date())
: formatter.string(from: date)
}
জন্ম তারিখ প্রবেশ করানো — আরেকটি সাধারণ পরিস্থিতি। DateFormatter একটি নির্দিষ্ট dateFormat "dd.MM.yyyy" এবং locale "ru_RU" দিয়ে কনফিগার করা হয়। প্রবেশ করানো স্ট্রিং পার্স করার সময় সম্ভাব্য ত্রুটিগুলি পরিচালনা করা গুরুত্বপূর্ণ: ফর্ম্যাটার অবৈধ স্ট্রিংয়ের জন্য nil ফেরত দেয়। সফল পার্সিংয়ের পরে, তারিখটি গ্রহণযোগ্য সীমার মধ্যে আছে কিনা তা পরীক্ষা করা হয় — 1900-এর আগে নয়, আজকের পরে নয়।
তারিখ সহ রিপোর্ট রপ্তানি ব্যবহারকারীর লোকেল থেকে স্বাধীন একটি নির্দিষ্ট ফর্ম্যাট প্রয়োজন। locale en_US_POSIX এবং সময় অঞ্চল UTC সহ dateFormat "yyyy-MM-dd HH:mm:ss" ব্যবহার করুন। এই পদ্ধতি নিশ্চিত করে যে ফাইলটি সিস্টেমের আঞ্চলিক সেটিংস নির্বিশেষে যেকোনো দেশে সঠিকভাবে খুলবে।
| পরিস্থিতি | ফর্ম্যাটার | মূল সেটিং |
|---|---|---|
| নিউজ ফিড | RelativeDateFormatter | unitsStyle = .full |
| তারিখ ইনপুট | DateFormatter | dateFormat + ফলব্যাক |
| API সিরিয়ালাইজেশন | ISO8601DateFormatter | withInternetDateTime |
| রিপোর্ট রপ্তানি | DateFormatter | en_US_POSIX + UTC |
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সবচেয়ে সাধারণ কারণ — dateFormat এবং স্ট্রিং ফর্ম্যাটের মধ্যে অমিল। উদাহরণস্বরূপ, ফর্ম্যাট "dd.MM.yyyy" স্ট্রিং "2026-07-21" পার্স করবে না। দ্বিতীয় কারণ — লোকেল অমিল: স্ট্রিং "July 21, 2026" ru_RU লোকেলের সাথে পার্স হবে না। তৃতীয় — LDML চিহ্নে টাইপো: yyyy ব্যবহার করুন, YYYY নয় (ভিন্ন অর্থ)।
না। DateFormatter একটি ভারী অবজেক্ট, এর আরম্ভে লোকেল ডেটা লোড করা অন্তর্ভুক্ত। প্রতি ফর্ম্যাটিং টাইপের জন্য একটি ইনস্ট্যান্স তৈরি করুন এবং এটি পুনরায় ব্যবহার করুন। মাল্টি-থ্রেডেড পরিবেশে, থ্রেড-লোকাল স্টোরেজ বা সিরিয়াল কিউ সহ ফর্ম্যাটার পুল ব্যবহার করুন সিঙ্ক্রোনাইজেশনের জন্য।
DateFormatter একটি পরম তারিখ প্রদর্শন করে (21 জুলাই 2026), যেখানে RelativeDateFormatter একটি আপেক্ষিক তারিখ প্রদর্শন করে (আজ, গতকাল, 3 দিনের মধ্যে)। RelativeDateFormatter iOS 15+-এ চালু করা হয়েছিল এবং একই LDML টেমপ্লেট ব্যবহার করে কিন্তু স্বয়ংক্রিয়ভাবে আপেক্ষিক প্রদর্শন নির্বাচন করে।
পার্স করার আগে ফর্ম্যাটারের timeZone UTC-তে সেট করুন। যদি সার্ভার সময় অঞ্চল নির্দেশ ছাড়া স্থানীয় সময়ে তারিখ ফেরত দেয়, API স্পেসিফিকেশন পরীক্ষা করুন — সম্ভবত UTC বোঝানো হয়েছে। শেষে Z সহ ISO 8601-এর জন্য, timeZone-এর প্রয়োজন নেই — ফর্ম্যাটার স্ট্রিং থেকে অফসেট পার্স করে।
সিঙ্ক্রোনাইজেশন ছাড়া বিভিন্ন থ্রেড থেকে একটি ইনস্ট্যান্স ব্যবহার করবেন না। প্রতিটি থ্রেডে একটি নতুন ইনস্ট্যান্স তৈরি করুন বা স্টোরেজের জন্য Thread.current.threadDictionary ব্যবহার করুন। একটি বিকল্প হল string(from:) এবং date(from:)-এর সময়কালের জন্য লকিং সহ NSLock।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন