मोबाइल डेवलपमेंट में दिनांक और समय — मोबाइल इंजीनियरिंग में महत्वपूर्ण विषयों में से एक है। 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 प्रदान करता है। मोबाइल प्लेटफ़ॉर्म के लिए दोनों API डिवाइस के वर्तमान समय क्षेत्र का स्वचालित पता लगाने का समर्थन करते हैं। मोबाइल एप्लिकेशन में दिनांक 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 के बिना पुराने API के लिए, 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।