किसी अन्य समय क्षेत्र में प्रकाशन का समय फ़ॉर्मैट करने के लिए, मूल क्षण को बनाए रखें और फ़ॉर्मैटर को गंतव्य समय क्षेत्र दें। यह Mac Terminal गाइड, प्रदर्शित पाठ को पार्स किए बिना या घंटे मैन्युअल रूप से जोड़े बिना, पढ़ने योग्य प्रकाशन लेबल तैयार करती है।
रूपांतरण से पहले आपको कौन-सी जानकारी चाहिए?
मान लें कि आप अपने Mac पर कोई दस्तावेज़ तैयार कर रहे हैं और आपको कृत्रिम प्रकाशन टाइमस्टैम्प 2025-07-15T00:30:00Z मिलता है। आपको America/Los_Angeles में दिखाई गई प्रकाशन तारीख और समय चाहिए। काम है उसी क्षण को गंतव्य के कैलेंडर की तारीख और घड़ी के समय के रूप में बताना।
यह तय करने के लिए कि आपके पास पर्याप्त जानकारी है या नहीं, चार शब्द महत्वपूर्ण हैं:
| शब्द | कृत्रिम उदाहरण | इस काम के लिए अर्थ |
|---|---|---|
| नागरिक तारीख | 2025-07-15 |
कैलेंडर का दिन, बिना समय या समय क्षेत्र के |
| क्षण | 2025-07-15T00:30:00Z द्वारा दर्शाया गया क्षण |
समय का वह बिंदु जिसे आप बनाए रखते हैं |
| UTC ऑफ़सेट | -07:00 |
किसी खास क्षण पर स्थानीय समय और UTC के बीच का अंतर |
| नामित समय क्षेत्र | America/Los_Angeles |
लागू ऑफ़सेट तय करने के लिए उपयोग किए जाने वाले नियम |
RFC 3339 में ऐसी टाइमस्टैम्प परिभाषित हैं जिनमें पूरी तारीख, समय और UTC ऑफ़सेट शामिल होते हैं। RFC 9557 आगे का अंतर समझाता है: नामित समय क्षेत्र ऐसे नियम देता है जो किसी क्षण को ऑफ़सेट से जोड़ते हैं, जबकि टाइमस्टैम्प में केवल संख्यात्मक ऑफ़सेट से यह पता नहीं चलता कि किसी स्थान का ऑफ़सेट अन्य समयों पर कैसे बदलता है। RFC 3339, Section 5.6, RFC 9557, Section 1.2।
कोई भी रूपांतरण करने से पहले यह तय करें कि आपका इनपुट किस स्थिति में आता है:
- आपके पास पहले से Foundation
Dateहै: उसे सीधे गंतव्य समय क्षेत्र के लिए कॉन्फ़िगर किए गए फ़ॉर्मैटर को दें। - आपके पास
Zवाला टाइमस्टैम्प या स्पष्ट संख्यात्मक ऑफ़सेट है: पहले उस मूल टाइमस्टैम्प को पार्स करें, फिर मिले हुए क्षण को फ़ॉर्मैट करें। - आपके पास केवल नागरिक तारीख है: उसे तारीख के रूप में बनाए रखें, जब तक काम में स्पष्ट रूप से समय और समय क्षेत्र न दिया गया हो।
- आपके पास ऑफ़सेट के बिना स्थानीय तारीख और समय है: इसे क्षण मानने से पहले स्रोत समय क्षेत्र प्राप्त करें और किसी भी अस्पष्टता का समाधान करें।
उदाहरण के लिए, 2025-07-15 से यह नहीं पता चलता कि प्रकाशन किसी अन्य समय क्षेत्र में आधी रात से पहले हुआ था या बाद में। आधी रात तय कर देना एक धारणा जोड़ना होगा। इसी तरह, ऑफ़सेट बदलने के आसपास स्थानीय घड़ी का एक समय शून्य या एक से अधिक क्षणों से मेल खा सकता है; RFC 9557 इस सीमा का वर्णन करता है। पहले से स्थापित क्षण का रूपांतरण करने से उलटे मैपिंग की यह समस्या टल जाती है। RFC 9557, Section 1.2।
डिस्प्ले टेक्स्ट को दोबारा पार्स करने से क्यों बचें?
Apple के अनुसार Foundation का Date, किसी कैलेंडर या समय क्षेत्र से स्वतंत्र, समय का एक विशिष्ट बिंदु है। दूसरे समय क्षेत्र में दिखाने के लिए इसकी वैल्यू को किसी दूसरी Date में बदलने की ज़रूरत नहीं होती। टेक्स्ट तैयार करने के लिए फ़ॉर्मैटिंग में आवश्यक कैलेंडर और समय क्षेत्र दिए जाते हैं। Date।
डिस्प्ले लेबल में कुछ जानकारी छूट सकती है। अगर आप किसी क्षण को समय के बिना केवल तारीख के रूप में फ़ॉर्मैट करते हैं और फिर उस लेबल को पार्स करते हैं, तो लेबल से छूटा हुआ समय वापस नहीं पाया जा सकता। Apple के फ़ॉर्मैटिंग दस्तावेज़ों में तारीख-केवल राउंड ट्रिप का उदाहरण है, जो आधी रात को फिर से बनाता है। आधी रात अभीष्ट हो तो यह उपयोगी है, लेकिन किसी मनमाने प्रकाशन क्षण को बनाए नहीं रखता। Date.FormatStyle।
काम का क्रम इस तरह रखें:
- मूल टाइमस्टैम्प पढ़ें या मौजूदा
Dateप्राप्त करें। - उस क्षण को काम की वैल्यू के रूप में बनाए रखें।
- गंतव्य समय क्षेत्र, कैलेंडर और डिस्प्ले लोकेल चुनें।
- बनाए रखे गए क्षण को फ़ॉर्मैट करके अंतिम लेबल तैयार करें।
ऑफ़सेट को मैन्युअल रूप से जोड़ने से काम बदल जाता है। Apple के अनुसार addingTimeInterval(_:) बीता हुआ समय जोड़कर एक नई तारीख बनाता है। इसलिए सात घंटे जोड़ने से एक दूसरा क्षण मिलता है; फ़ॉर्मैटर का समय क्षेत्र चुनने से मूल क्षण का निरूपण बदलता है। Date।
अपने Mac पर प्रकाशन समय का पूरा उदाहरण चलाएँ
इस उदाहरण के लिए macOS 12 या बाद का संस्करण चाहिए, जिसमें Apple का Date.FormatStyle API उपलब्ध है, और एक काम करने वाला Swift टूलचेन चाहिए। इसमें Foundation का उपयोग होता है और किसी अतिरिक्त पैकेज की ज़रूरत नहीं है। Date.FormatStyle।
Terminal खोलें और टूलचेन जाँचें:
swift --version
अगर आपको Apple के कमांड-लाइन टूल चाहिए, तो नीचे दिया गया कमांड चलाएँ और इंस्टॉलेशन डायलॉग पूरा करें। Apple इस इंस्टॉलेशन तरीके का दस्तावेज़ देता है और बताता है कि Xcode के पूरे इंस्टॉलेशन में कमांड-लाइन टूल पहले से शामिल होते हैं। फिर संस्करण की जाँच दोबारा करें। कमांड-लाइन टूल इंस्टॉल करना।
xcode-select --install
TextEdit में नया दस्तावेज़ बनाएँ और Format > Make Plain Text चुनें। नीचे दिया पूरा Swift प्रोग्राम पेस्ट करें और उसे Desktop पर publication-time.swift नाम से सेव करें। सुनिश्चित करें कि बनी हुई फ़ाइल का नाम .swift पर खत्म हो और उसके साथ अतिरिक्त .txt एक्सटेंशन न जुड़ा हो। Apple की TextEdit गाइड में सादे टेक्स्ट दस्तावेज़ बनाने, बदलने और सेव करने के निर्देश हैं। Mac पर TextEdit में दस्तावेज़ बनाना, खोलना और बदलना।
यह प्रोग्राम दिए गए पूर्ण-सेकंड टाइमस्टैम्प को स्वीकार करता है, उसे एक बार पार्स करता है और उसी instant से तीन निरूपण बनाता है। Apple, ISO 8601 निरूपणों को पार्स करने और बनाने के लिए ISO8601DateFormatter तथा RFC 3339 फ़ॉर्मैट के लिए उसका withInternetDateTime विकल्प बताता है। ISO8601DateFormatter, withInternetDateTime।
import Foundation
// Synthetic publication data. Change these two values as needed.
let sourceTimestamp = "2025-07-15T00:30:00Z"
let destinationIdentifier = "America/Los_Angeles"
enum ConversionError: Error {
case invalidTimestamp(String)
case unknownTimeZone(String)
}
let inputFormatter = ISO8601DateFormatter()
inputFormatter.formatOptions = [.withInternetDateTime]
inputFormatter.timeZone = TimeZone(secondsFromGMT: 0)
guard let instant = inputFormatter.date(from: sourceTimestamp) else {
throw ConversionError.invalidTimestamp(sourceTimestamp)
}
guard let destination = TimeZone(identifier: destinationIdentifier) else {
throw ConversionError.unknownTimeZone(destinationIdentifier)
}
let destinationFormatter = ISO8601DateFormatter()
destinationFormatter.formatOptions = [.withInternetDateTime]
destinationFormatter.timeZone = destination
let publicationLabelStyle = Date.FormatStyle(
date: .long,
time: .complete,
locale: Locale(identifier: "en_GB"),
calendar: Calendar(identifier: .gregorian),
timeZone: destination
)
let publicationDateStyle = Date.FormatStyle(
date: .long,
time: .omitted,
locale: Locale(identifier: "en_GB"),
calendar: Calendar(identifier: .gregorian),
timeZone: destination
)
print("Source instant: \(inputFormatter.string(from: instant))")
print("Destination zone: \(destination.identifier)")
print("Destination timestamp: \(destinationFormatter.string(from: instant))")
print("Publication label: \(instant.formatted(publicationLabelStyle))")
print("Publication date: \(instant.formatted(publicationDateStyle))")
सेव किया हुआ प्रोग्राम चलाएँ:
swift "$HOME/Desktop/publication-time.swift"
दिए गए मानों के लिए, गंतव्य टाइमस्टैम्प 2025-07-14T17:30:00-07:00 होना चाहिए और प्रकाशन तारीख 14 जुलाई 2025 दर्शानी चाहिए। पढ़ने योग्य लेबल में समय और समय क्षेत्र की जानकारी भी शामिल होती है; उसके शब्दों और विराम-चिह्नों का सटीक रूप फ़ॉर्मैटिंग सिस्टम तय करता है।
Swift प्रोग्राम को प्राप्त API दस्तावेज़ों के आधार पर जाँचा गया, लेकिन शोध परिवेश में चलाया नहीं गया क्योंकि वहाँ Swift उपलब्ध नहीं था। उदाहरण में संख्यात्मक रूपांतरणों को Python की तारीख/समय और समय क्षेत्र API की मदद से अलग से जाँचा गया।
नतीजे को कौन-सी सेटिंग नियंत्रित करती हैं?
फ़ॉर्मैटर का इनिशियलाइज़र लोकेल, कैलेंडर और समय क्षेत्र के लिए अलग-अलग सेटिंग स्वीकार करता है। यहाँ en_GB ब्रिटिश अंग्रेज़ी की फ़ॉर्मैटिंग परंपराएँ माँगता है, ग्रेगोरियन कैलेंडर तारीख प्रणाली देता है और destination स्थानीय तारीख व घड़ी का समय तय करता है। किसी अन्य गंतव्य के लिए समय क्षेत्र पहचानकर्ता बदलें; किसी अन्य प्रस्तुति परंपरा के लिए लोकेल बदलें। init(date:time:locale:calendar:timeZone:capitalizationContext:)।
केवल तारीख वाला नतीजा भी सीधे instant से आता है। time: .omitted सेट करने से आउटपुट लेबल से समय हट जाता है। इसके लिए आधी रात पर नया क्षण बनाने की ज़रूरत नहीं होती।
आधी रात के बदलाव और मौसमी ऑफ़सेट जाँचें
यह जाँचने के लिए नीचे दिए गए कृत्रिम उदाहरण इस्तेमाल करें कि आपका नतीजा अभीष्ट काम को बनाए रखता है या नहीं। ये गणना किए गए गंतव्य निरूपणों वाले उदाहरणार्थ प्रकाशन टाइमस्टैम्प हैं।
| मूल क्षण | गंतव्य समय क्षेत्र | गंतव्य निरूपण |
|---|---|---|
2025-01-15T00:30:00Z |
America/Los_Angeles |
2025-01-14T16:30:00-08:00 |
2025-07-15T00:30:00Z |
America/Los_Angeles |
2025-07-14T17:30:00-07:00 |
2025-07-15T00:30:00Z |
Asia/Tokyo |
2025-07-15T09:30:00+09:00 |
2025-07-15T23:30:00Z |
Asia/Tokyo |
2025-07-16T08:30:00+09:00 |
पहली दो पंक्तियाँ दिखाती हैं कि किसी नामित गंतव्य के लिए एक तय समायोजन पर्याप्त क्यों नहीं है: लागू ऑफ़सेट उस क्षण पर निर्भर हो सकता है। आख़िरी दो पंक्तियाँ दिखाती हैं कि समय के साथ गंतव्य की पूरी कैलेंडर तारीख निकालना भी क्यों ज़रूरी है। प्रकाशन पिछली तारीख, उसी तारीख या अगली तारीख पर दिखाई दे सकता है।
नामित समय क्षेत्र, समय क्षेत्र डेटाबेस के नियमों का उपयोग करते हैं। IANA बताता है कि macOS उसका डेटाबेस इस्तेमाल करता है और अपडेट आम तौर पर ऑपरेटिंग सिस्टम के अपडेट के ज़रिए उपयोगकर्ताओं तक पहुँचते हैं। अगर अलग-अलग मशीनों पर नतीजे अलग हों, तो स्रोत टाइमस्टैम्प बदलने से पहले उनके समय क्षेत्र पहचानकर्ता और उपलब्ध अपडेट जाँचें। समय क्षेत्र और डेलाइट सेविंग टाइम डेटा।
इनपुट या आउटपुट अप्रत्याशित हो तो क्या करें?
इन जाँचों को क्रम से करें:
- पुष्टि करें कि स्रोत किसी क्षण की पहचान करता है। उसका
Zया संख्यात्मक ऑफ़सेट बनाए रखें। केवल तारीख वाली वैल्यू या स्थानीय घड़ी की रीडिंग के लिए अतिरिक्त जानकारी चाहिए। - गंतव्य पहचानकर्ता की पुष्टि करें।
America/Los_Angelesजैसे पहचानकर्ता का उपयोग करें। Apple का इनिशियलाइज़र किसी अज्ञात पहचानकर्ता के लिएnilलौटाता है; यह प्रोग्राम किसी दूसरे समय क्षेत्र की जगह उसे इस्तेमाल करने के बजाय त्रुटि के साथ रुकता है। - जाँचें कि टाइमस्टैम्प किस फ़ॉर्मैट में समर्थित है। उदाहरण पूर्ण-सेकंड वाले इंटरनेट टाइमस्टैम्प के लिए कॉन्फ़िगर किया गया है। भिन्नात्मक सेकंड या किसी अन्य इनपुट निरूपण के लिए उपयुक्त पार्सर कॉन्फ़िगरेशन चाहिए। बदलाव करते समय मूल इनपुट बनाए रखें।
- गंतव्य टाइमस्टैम्प के संख्यात्मक मान की तुलना करें। डिस्प्ले के विराम-चिह्नों की जाँच करने से पहले रूपांतरण को परखने के लिए उसकी तारीख, समय और ऑफ़सेट का उपयोग करें।
- जाँचें कि हर आउटपुट उसी मूल
instantका उपयोग करता है। बीच का ऐसा चरण हटा दें जो लेबल को फ़ॉर्मैट करके फिर अगले रूपांतरण के लिए उस लेबल को पार्स करता हो। init(identifier:), ISO8601DateFormatter।
RFC 9557 के तहत विस्तारित टाइमस्टैम्प में नामित समय क्षेत्र और ऑफ़सेट साथ भी दिए जा सकते हैं। इस मानक से यह साबित नहीं होता कि इस उदाहरण का पार्सर ब्रैकेट वाले समय क्षेत्र एनोटेशन का समर्थन करता है। जब तक आप विस्तारित फ़ॉर्मैट के इनपुट का रास्ता जानबूझकर लागू करके सत्यापित न करें, ऊपर उपयोग की गई अलग destinationIdentifier वैल्यू में गंतव्य पहचानकर्ता रखें। RFC 9557।
प्रकाशन लेबल के लिए मूल क्षण को पुनः उपयोग की जा सकने वाली वैल्यू के रूप में रखें और उसी से हर गंतव्य का टेक्स्ट बनाएँ। इससे आप प्रकाशन के उसी क्षण से जुड़े सभी लेबल बनाए रखते हुए गंतव्य समय क्षेत्र, डिस्प्ले भाषा या दिखने वाली जानकारी बदल सकते हैं।
स्रोत
- Date — Apple
- Date.FormatStyle — Apple
- init(date:time:locale:calendar:timeZone:capitalizationContext:) — Apple
- ISO8601DateFormatter — Apple
- withInternetDateTime — Apple
- init(identifier:) — Apple
- कमांड-लाइन टूल इंस्टॉल करना — Apple
- Mac पर TextEdit में दस्तावेज़ बनाना, खोलना और बदलना — Apple
- RFC 3339: इंटरनेट पर तारीख और समय: टाइमस्टैम्प — RFC Editor
- RFC 9557: इंटरनेट पर तारीख और समय: अतिरिक्त जानकारी वाले टाइमस्टैम्प — RFC Editor
- समय क्षेत्र और डेलाइट सेविंग टाइम डेटा — IANA