DateComponents হল একটি Foundation স্ট্রাকচার যা ক্যালেন্ডার তারিখের উপাদানগুলোকে পৃথক ফিল্ড হিসেবে সংরক্ষণ করে: বছর, মাস, দিন, ঘন্টা, মিনিট, সেকেন্ড এবং অন্যান্য। Date-এর বিপরীতে, যা সময়ের একটি পরম মুহূর্ত উপস্থাপন করে, DateComponents মানব-পাঠযোগ্য মান ধারণ করে যা ক্যালেন্ডার এবং সময় অঞ্চলের উপর নির্ভর করে। Apple Developer Documentation (2025) অনুসারে, DateComponents Date এবং Calendar-এর মধ্যে একটি মধ্যবর্তী সংযোগ হিসেবে ব্যবহৃত হয় — এর মাধ্যমে ক্যালেন্ডার তারিখগুলো নিষ্কাশিত এবং নির্মিত হয়, ম্যানুয়াল পাটিগণিত ছাড়াই গণনা এবং তারিখ স্থানান্তর সম্পাদিত হয়।
মূল বিষয়
DateComponents হল একটি Foundation ভ্যালু-টাইপ যা ক্যালেন্ডার সময়ের উপাদান সংরক্ষণের জন্য ডিজাইন করা হয়েছে। প্রতিটি উপাদান একটি ঐচ্ছিক Int ফিল্ড দ্বারা উপস্থাপিত: year, month, day, hour, minute, second, nanosecond, weekday, weekOfMonth, weekOfYear, quarter, yearForWeekOfYear এবং অন্যান্য।
Date থেকে প্রধান পার্থক্য হল ক্যালেন্ডার বন্ধন। Date পরম সময় সংরক্ষণ করে (রেফারেন্স তারিখ থেকে সেকেন্ডের সংখ্যা), যখন DateComponents একটি মানব-পাঠযোগ্য উপস্থাপনা যা শুধুমাত্র একটি নির্দিষ্ট Calendar-এর প্রসঙ্গে অর্থবহ। একই Date বিভিন্ন ক্যালেন্ডার এবং সময় অঞ্চলে ভিন্ন DateComponents দ্বারা উপস্থাপিত হতে পারে।
DateComponents একটি স্বাধীন সময়ের ধরন নয়, বরং একটি ডেটা ধারক। DateComponents-কে তারিখ হিসেবে ব্যাখ্যা করতে একটি Calendar প্রয়োজন যা বোঝে কীভাবে উপাদানগুলো ক্যালেন্ডার সিস্টেমের সাথে সম্পর্কিত। Calendar.dateComponents(from: Date) উপাদান নিষ্কাশন সম্পাদন করে, Calendar.date(from: DateComponents) বিপরীত সমাবেশ সম্পাদন করে।
DateComponents-এর প্রতিটি ফিল্ড ঐচ্ছিক (Int?), যা আংশিক তারিখ নিয়ে কাজ করার জন্য মৌলিক। যদি শুধুমাত্র বছর এবং মাস নির্দিষ্ট করা হয়, Calendar অনুপস্থিত ফিল্ডগুলি ডিফল্ট মান দিয়ে পূরণ করে: দিন = 1, ঘন্টা = 0, মিনিট = 0। এটি সময়কালের শুরু তারিখ তৈরি করার জন্য সুবিধাজনক — শুধুমাত্র প্রাসঙ্গিক উপাদান নির্দিষ্ট করতে হবে।
== অপারেটরের মাধ্যমে DateComponents তুলনা করার সময়, শুধুমাত্র নির্দিষ্ট (নন-nil) ফিল্ডের তুলনা করা হয়। দুটি DateComponents স্ট্রাকচার উভয়ই বছর 2026 কিন্তু ভিন্ন মাস সহ ভিন্ন বলে বিবেচিত হয়। NSObjectProtocol-এর isEqual DateComponents-এ প্রযোজ্য নয় — DateComponents NSObject থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয়।
প্রধান ফিল্ড DateComponents-এ year, month, day, hour, minute, second, nanosecond অন্তর্ভুক্ত। প্রতিটি ফিল্ড সংশ্লিষ্ট ইউনিটে একটি সংখ্যাসূচক মান সংরক্ষণ করে: বছর — 2026, মাস — 1..12, দিন — 1..31, ঘন্টা — 0..23, মিনিট — 0..59, সেকেন্ড — 0..59। ন্যানোসেকেন্ড 0 থেকে 999999999 পর্যন্ত হতে পারে।
সপ্তাহের ফিল্ড — weekday (1..7, যেখানে 1 = গ্রেগরিয়ান ক্যালেন্ডারে রবিবার), weekOfMonth, weekOfYear। এই ফিল্ডগুলো Calendar-এর উপর নির্ভর করে এবং এর প্রসঙ্গের বাইরে এর কোনো অর্থ নেই। weekday ক্যালেন্ডারের firstWeekday সেটিং-এর উপর নির্ভর করে: রুশ লোকেলে সপ্তাহ সোমবার থেকে শুরু হয় (গ্রেগরিয়ান সিস্টেমে weekday = 2), যখন আমেরিকান লোকেলে রবিবার থেকে শুরু হয় (weekday = 1)।
বিশেষায়িত ফিল্ড — quarter (1..4), yearForWeekOfYear (যে বছর সপ্তাহটি সম্পর্কিত), isLeapMonth (হিব্রু বা চীনা ক্যালেন্ডারে অধিমাসের জন্য বুলিয়ান ফ্ল্যাগ)। calendar এবং timeZone ফিল্ড সংশ্লিষ্ট অবজেক্টের রেফারেন্স সংরক্ষণ করে যার সাথে স্ট্রাকচারটি তৈরি করা হয়েছিল।
| বিভাগ | ফিল্ড | পরিসর |
|---|---|---|
| ক্যালেন্ডার | year, month, day | 1..∞, 1..12, 1..31 |
| সময় | hour, minute, second, nanosecond | 0..23, 0..59, 0..59, 0..999999999 |
| সপ্তাহ | weekday, weekOfMonth, weekOfYear | 1..7, 1..5, 1..53 |
| বিশেষ | quarter, yearForWeekOfYear | 1..4, নির্ভরশীল |
Calendar.dateComponents-এর মাধ্যমে উপাদান নিষ্কাশন করার সময়, কর্মক্ষমতার জন্য শুধুমাত্র প্রয়োজনীয় ফিল্ড অনুরোধ করা গুরুত্বপূর্ণ। Calendar একক পাসে সমস্ত অনুরোধকৃত ফিল্ড নিষ্কাশন করে — এটি প্রতিটি ফিল্ডের জন্য আলাদাভাবে Calendar.component কল করার চেয়ে উল্লেখযোগ্যভাবে দ্রুত।
DateComponents আরম্ভকরণ — সবচেয়ে সহজ উপায়: একটি খালি স্ট্রাকচার তৈরি করুন এবং প্রয়োজনীয় ফিল্ড পূরণ করুন। সমস্ত অনির্দিষ্ট ফিল্ড স্বয়ংক্রিয়ভাবে nil পায়। আংশিক উপাদান থেকে তৈরি একটি তারিখ আরম্ভকরণের সময় বৈধ করা হয় না — ত্রুটি শুধুমাত্র Calendar-এর মাধ্যমে Date-এ রূপান্তরের সময় ঘটতে পারে।
আরম্ভক DateComponents(calendar:timeZone:era:year:month:day:hour:minute:second:nanosecond:weekday:…) একটি কলেই সমস্ত ফিল্ড সেট করার অনুমতি দেয়। এই আরম্ভক প্রস্তুত মান থেকে সম্পূর্ণ তারিখ তৈরি করার জন্য সুবিধাজনক, কিন্তু পঠনযোগ্যতার কারণে খুব কমই 5-6টির বেশি আর্গুমেন্টের সাথে ব্যবহৃত হয়।
Calendar.dateComponents(_:from:) — বিদ্যমান Date থেকে DateComponents পাওয়ার প্রাথমিক উপায়। দ্বিতীয় আর্গুমেন্ট হল নিষ্কাশন করার জন্য উপাদানের সেট। Calendar সময় অঞ্চল বিবেচনায় নিয়ে ক্যালেন্ডার গণনা সম্পাদন করে এবং শুধুমাত্র অনুরোধকৃত ফিল্ড সহ একটি স্ট্রাকচার ফেরত দেয়; অবশিষ্ট ফিল্ড nil থাকে।
import Foundation
// ফিল্ড আরম্ভকের মাধ্যমে তৈরি
var components = DateComponents()
components.year = 2026
components.month = 7
components.day = 21
// Date থেকে নিষ্কাশন
let now = Date()
let extracted = Calendar.current.dateComponents(
[.year, .month, .day],
from: now
)
print("Today: \(extracted.day!).\(extracted.month!).\(extracted.year!)")
// বর্ধিত আরম্ভকের মাধ্যমে তৈরি
let birthday = DateComponents(
calendar: Calendar.current,
year: 1990, month: 5, day: 15
)
DateComponents ম্যানুয়ালি ফিল্ড সেট করে তৈরি করার সময়, Date-এ রূপান্তরের আগে সর্বদা Calendar পরীক্ষা করুন। date(from:) রূপান্তরের সময়, Calendar nil ফেরত দিতে পারে যদি উপাদান একটি অস্তিত্বহীন তারিখ গঠন করে — যেমন, 31 ফেব্রুয়ারি বা অ-লিপ ইয়ারে 30 ফেব্রুয়ারি। তারিখ যাচাইকরণ Calendar-এর দায়িত্ব, DateComponents-এর নয়।
Calendar.date(from:) — DateComponents-কে Date-এ রূপান্তরের প্রাথমিক পদ্ধতি। Calendar নিজস্ব ক্যালেন্ডার এবং সময় অঞ্চল অনুযায়ী উপাদান ব্যাখ্যা করে। যদি কিছু ফিল্ড সেট না থাকে (nil), Calendar ডিফল্ট মান ব্যবহার করে: দিন = 1, ঘন্টা = 0, মিনিট = 0, সেকেন্ড = 0।
পদ্ধতিটি একটি ঐচ্ছিক Date ফেরত দেয় — nil ঘটে যখন উপাদান একে অপরের সাথে বিরোধিতা করে বা একটি অবৈধ তারিখ গঠন করে। nil-এর সাধারণ কারণ: অস্তিত্বহীন তারিখ (32 জানুয়ারি, 29 ফেব্রুয়ারি 2023), বিরোধপূর্ণ ফিল্ড (একই সেটে weekday=1, day=5), প্রদত্ত ক্যালেন্ডারের জন্য অসম্ভব বছর (গ্রেগরিয়ান ক্যালেন্ডারে বছর 0)।
timeZone সহ DateComponents — যদি DateComponents-এ timeZone থাকে, Calendar রূপান্তরের সময় এটি ব্যবহার করে। যদি timeZone নির্দিষ্ট না থাকে, Calendar নিজস্ব বর্তমান timeZone ব্যবহার করে। যদি Calendar.timeZone তারিখের প্রত্যাশিত সময় অঞ্চলের সাথে মেলে না, ফলাফল কয়েক ঘন্টার দ্বারা ভিন্ন হতে পারে — নিশ্চিত করুন যে timeZone একটি অবজেক্টে স্পষ্টভাবে সেট করা আছে।
let calendar = Calendar(identifier: .gregorian)
// DateComponents থেকে Date তৈরি
var comps = DateComponents()
comps.year = 2026
comps.month = 12
comps.day = 25
comps.hour = 10
if let date = calendar.date(from: comps) {
print("Christmas: \(date)")
}
// timeZone উল্লেখ করে তৈরি
calendar.timeZone = TimeZone(identifier: "UTC")!
let utcComps = DateComponents(
calendar: calendar, year: 2026, month: 7, day: 21,
hour: 12
)
let utcDate = calendar.date(from: utcComps)!
Calendar.dateComponents তারিখের পার্থক্যের জন্য — DateComponents-এর আরেকটি ব্যবহারের ক্ষেত্রে। Calendar.dateComponents([.year, .month, .day], from: Date(), to: futureDate) দুটি তারিখের মধ্যে বছর, মাস এবং দিনের পার্থক্য ফেরত দেয়। এটি TimeInterval-কে এক বছরে সেকেন্ডের সংখ্যা দিয়ে ভাগ করার পরিবর্তে বয়স গণনার সঠিক উপায়, কারণ Calendar লিপ ইয়ার বিবেচনায় নেয়।
Calendar — কেন্দ্রীয় ক্লাস যা DateComponents-এর সাথে কাজ করে। তারিখ নিষ্কাশন, সমাবেশ এবং তুলনার সমস্ত কার্যক্রম Calendar-এর মাধ্যমে হয়। Calendar ছাড়া, DateComponents কেবল সংখ্যার একটি সেট যার কোনো সাময়িক অর্থ নেই। Calendar উপাদানগুলোকে তাদের ব্যাখ্যা দেয়: এটি নির্ধারণ করে যে মাস 2 হল ফেব্রুয়ারি, এবং weekday 2 হল সোমবার।
Calendar.nextDate এবং Calendar.enumerateDates — দুটি পদ্ধতি যা DateComponents-এর উপর ভিত্তি করে। nextDate(after: Date(), matching: DateComponents) নির্দিষ্ট উপাদানের সাথে মিলে যাওয়া পরবর্তী তারিখ খুঁজে পায় — যেমন, আজকের পরে পরবর্তী সোমবার। enumerateDates(startingAfter:matching:matchingPolicy:using:) নির্দিষ্ট সীমা পর্যন্ত প্যাটার্নের সাথে মিলে যাওয়া সমস্ত তারিখের উপর পুনরাবৃত্তি করে।
Calendar.dateInterval — একটি পদ্ধতি যা নির্দিষ্ট উপাদানের জন্য একটি DateInterval ফেরত দেয়। dateInterval(of: .month, for: Date()) বর্তমান মাসের শুরু এবং শেষ ফেরত দেয়। অভ্যন্তরীণভাবে, এই পদ্ধতি সময়সীমার সীমানা খুঁজতে DateComponents ব্যবহার করে: এটি মাসের প্রথম এবং শেষ দিনের সাথে DateComponents তৈরি করে এবং Calendar-এর মাধ্যমে Date-এ রূপান্তর করে।
let calendar = Calendar.current
// পরবর্তী সোমবার
let nextMonday = calendar.nextDate(
after: Date(),
matching: DateComponents(weekday: 2),
matchingPolicy: .nextTime
)!
// দিনে তারিখের মধ্যে পার্থক্য
let diff = calendar.dateComponents(
[.day], from: Date(), to: nextMonday
)
// মাসের পরিসর
let monthInterval = calendar.dateInterval(
of: .month, for: Date()
)!
let startOfMonth = monthInterval.start
let endOfMonth = monthInterval.end
MatchingPolicy — DateComponents-এর সাথে কাজ করার সময় Calendar পদ্ধতির একটি গুরুত্বপূর্ণ প্যারামিটার। strictPolicy-এর জন্য সমস্ত উপাদানের সঠিক মিল প্রয়োজন, nextTimePolicy পরবর্তী সময়-ভিত্তিক মিল নির্বাচন করে, nextTimePreservingSmallerComponents উৎস তারিখ থেকে ছোট উপাদান (মিনিট, সেকেন্ড) সংরক্ষণ করে। নীতি পছন্দ তারিখ অনুসন্ধানের ফলাফলকে প্রভাবিত করে, বিশেষ করে ডেলাইট সেভিং টাইম পরিবর্তনের মাধ্যমে স্থানান্তরের সময়।
আসুন একটি অ্যাপ্লিকেশনে DateComponents-এর ব্যবহারিক প্রয়োগের ক্ষেত্রগুলো অন্বেষণ করি। প্রতিটি উদাহরণ একটি সাধারণ কাজ প্রদর্শন করে যা একজন iOS ডেভেলপার ক্যালেন্ডার তারিখ নিয়ে কাজ করার সময় সম্মুখীন হয়।
Calendar.nextDate DateComponents(day: 1) সহ পরবর্তী মাসের প্রথম দিন খুঁজে পায়। Calendar স্বয়ংক্রিয়ভাবে বর্তমান মাসে দিনের সংখ্যা নির্ধারণ করে এবং পরবর্তীতে চলে যায়। পুনরাবৃত্ত বিজ্ঞপ্তির জন্য, Calendar কী সহ enumerateDates বা Combine.Timer ব্যবহার করুন।
func firstDayOfNextMonth(from date: Date) -> Date {
let calendar = Calendar.current
let comps = DateComponents(day: 1)
return calendar.nextDate(
after: date,
matching: comps,
matchingPolicy: .nextTime
)!
}
// বছরে বয়স গণনা
func ageInYears(from birthDate: Date) -> Int {
let calendar = Calendar.current
let ageComponents = calendar.dateComponents(
[.year], from: birthDate, to: Date()
)
return ageComponents.year ?? 0
}
// বছর এবং মাস অনুসারে ইভেন্ট গ্রুপিং
func groupEventsByMonth(_ events: [Event]) -> [String: [Event]] {
let calendar = Calendar.current
return Dictionary(grouping: events) { event in
let comps = calendar.dateComponents(
[.year, .month], from: event.date
)
return "\(comps.year!)-\(comps.month!)"
}
}
বয়স গণনা Calendar.dateComponents([.year], from:to:) এর মাধ্যমে — লিপ ইয়ার বিবেচনায় নেওয়ার একমাত্র সঠিক উপায়। TimeInterval-ভিত্তিক গণনা (সেকেন্ড / 31536000) 29 ফেব্রুয়ারিতে জন্মগ্রহণকারী লোকদের জন্য ত্রুটি দেয়। Calendar সঠিকভাবে নির্ধারণ করে যে বর্তমান বছরে জন্মদিন হয়েছে কিনা এবং সঠিক বয়স ফেরত দেয়।
বছর এবং মাস অনুসারে গ্রুপিং — ইতিহাস বা ক্যালেন্ডার স্ক্রিনের জন্য একটি সাধারণ কাজ। DateComponents গ্রুপিং কী হিসাবে কাজ করে: ইভেন্টের তারিখ থেকে বছর এবং মাস নিষ্কাশন করুন, একটি স্ট্রিং কী তৈরি করুন এবং Dictionary(grouping:) এর মাধ্যমে গ্রুপ করুন। প্রদর্শনের জন্য, স্থানীয়কৃত মাসের নামের জন্য "LLLL yyyy" টেমপ্লেট সহ DateFormatter ব্যবহার করুন।
| কাজ | Calendar পদ্ধতি | DateComponents ভূমিকা |
|---|---|---|
| মাসের প্রথম দিন | nextDate(after:matching:) | day: 1 |
| বয়স গণনা | dateComponents(from:to:) | পার্থক্য থেকে [.year] |
| তারিখ গ্রুপিং | dateComponents(_:from:) | year + month কী |
| সপ্তাহের দিন অনুসন্ধান | nextDate(after:matching:) | weekday: N |
প্রায়শই জিজ্ঞাসিত প্রশ্ন
কারণ: অস্তিত্বহীন তারিখ (31 এপ্রিল), বিরোধপূর্ণ ফিল্ড (weekday=1 এর সাথে day=5), নির্বাচিত ক্যালেন্ডারের জন্য ফিল্ডের অবৈধ সমন্বয়। Calendar তার সিস্টেমে উপাদান ব্যাখ্যা করার চেষ্টা করে — যদি সমন্বয় অসম্ভব হয়, ফলাফল nil হয়। রূপান্তরের সময় সর্বদা guard let বা if let ব্যবহার করুন।
হ্যাঁ, == অপারেটরের মাধ্যমে। DateComponents Equatable প্রয়োগ করে, সমস্ত ফিল্ড তুলনা করে। দুটি স্ট্রাকচার সমান যদি তাদের সমস্ত ফিল্ড সমান হয় (nil == nil সত্য হিসেবে বিবেচিত হয়)। শুধুমাত্র ফিল্ডের একটি উপসেট তুলনা করতে — Calendar.dateComponents-এর মাধ্যমে একই সেট নিষ্কাশন করুন।
Date ক্যালেন্ডার বন্ধন ছাড়াই সময়ের একটি পরম মুহূর্ত। DateComponents মানব-পাঠযোগ্য সংখ্যার (বছর, মাস, দিন) একটি সেট যা শুধুমাত্র Calendar-এর প্রসঙ্গে অর্থবহ। Date তুলনা, বিয়োগ, ISO 8601-এ সিরিয়ালাইজ করা যেতে পারে। DateComponents ক্যালেন্ডারের সাথে মিথস্ক্রিয়ার জন্য একটি মধ্যবর্তী উপস্থাপনা।
শুধুমাত্র year এবং month ফিল্ড সেট করুন, বাকি nil রেখে দিন। Calendar.date(from:) এর মাধ্যমে Date-এ রূপান্তরের সময়, Calendar স্বয়ংক্রিয়ভাবে দিন = 1, ঘন্টা = 0, মিনিট = 0 সেট করবে। ফলাফল হল নির্দিষ্ট মাসের প্রথম দিন মধ্যরাতে সংশ্লিষ্ট Date।
DateComponents তার ফিল্ডে সময় অঞ্চলের তথ্য সংরক্ষণ করে না — ফিল্ডের মান (বছর, মাস, দিন) নিজেই সেই timeZone-এর উপর নির্ভর করে যাতে সেগুলো নিষ্কাশিত হয়েছিল। উপাদান "21 জুলাই 2026 14:00 MSK" এবং "21 জুলাই 2026 10:00 UTC" একই Date উপস্থাপন করে, কিন্তু DateComponents ফিল্ড ভিন্ন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন