2012-03-20 14 views
7

मेरे पास डेटटाइम ऑब्जेक्ट है और मैं वर्तमान संस्कृति के लिए स्थानीयकृत एक स्ट्रिंग के रूप में घंटे, मिनट, दूसरा, और आंशिक सेकेंड आउटपुट करना चाहता हूं।मैं एक डेटटाइम को एक स्ट्रिंग में कैसे बदल सकता हूं जिसमें स्थानीयकृत आंशिक सेकंड हैं?

इसके साथ दो मुद्दे हैं।

पहला मुद्दा कोई मानक DateTime प्रारूप नहीं है जो fractional सेकंड दिखाएगा। मैं अनिवार्य रूप से जानना चाहता हूं कि long time डेटटाइम प्रारूप कैसे प्राप्त करें लेकिन आंशिक सेकंड के साथ।

मैं निश्चित रूप से DateTimeFormatInfo.LongTimePattern प्राप्त कर सकता हूं और इसे ".fff" जोड़ सकता हूं और इसे DateTime.ToString() पर भेज सकता हूं, लेकिन कुछ संस्कृति विशिष्ट प्रारूप, यूएस विशेष रूप से, AM/PM के साथ समाप्त होता है। तो यह इतना आसान नहीं है।

दूसरा मुद्दा यह है कि DateTime.ToString() संख्या दशमलव विभाजक को स्थानांतरित करने के लिए प्रतीत नहीं होता है। यदि मैंने प्रत्येक संस्कृति को हार्ड कोडित कस्टम टाइम प्रारूप का उपयोग करने के लिए मजबूर करने का निर्णय लिया है, तो यह अभी भी स्थानीयकृत स्ट्रिंग नहीं बनाएगा क्योंकि संख्या दशमलव विभाजक संस्कृति विशिष्ट नहीं होगा।

मामलों को जटिल बनाने के लिए, कुछ संस्कृतियों में दिनांक समय प्रारूप होते हैं जो उनके स्वरूपण के हिस्से के रूप में अवधि का उपयोग करते हैं। इससे प्लेसहोल्डर को रखना मुश्किल हो जाता है, उदाहरण के लिए अवधि और इसे संस्कृति विशिष्ट दशमलव विभाजक के साथ प्रतिस्थापित करें।

अभी के लिए मैं इस समाधान का सहारा लिया:

string format = string.Format("HH:mm:ss{0}fff", 
    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 
string time = DateTime.Now.ToString(format); 

कौन सा मुझे लगता है कि हर संस्कृति उस समय विभाजक के रूप में एक ही दशमलव विभाजक नहीं है के लिए काम करना चाहिए, लेकिन यह एक अनुमान है।

नोट: हालांकि, मेरे विशिष्ट अनुप्रयोग के लिए दोनों मुद्दों का समाधान करना अच्छा लगेगा, लेकिन मानक दिनांक समय प्रारूप का उपयोग करने के बजाय मैं आंशिक सेकंड के साथ कस्टम दिनांक समय प्रारूप को स्थानीयकृत करने में अधिक रुचि रखता हूं।

+0

मुझे नहीं लगता कि किसी भी सांस्कृतिक सम्मेलन में आंशिक सेकंड शामिल हैं। आपका दृष्टिकोण ठीक दिखता है लेकिन एएम/पीएम बनाम एचएच समस्या को दूर करने के लिए मुझे लांगटाइम पैटर्न और विकल्प 'एसएस' मिलेगा। –

उत्तर

6

पहला मुद्दा कोई मानक डेटटाइम प्रारूप नहीं है जो आंशिक सेकंड दिखाएगा। मैं अनिवार्य रूप से जानना चाहता हूं कि लंबे समय तक डेटटाइम प्रारूप कैसे प्राप्त करें लेकिन आंशिक सेकंड के साथ।

आप लंबे प्रारूप लेने और बस बदलने पर विचार हो सकता है: के साथ "एस एस" ": ss.fff", संभवतः संस्कृति विशिष्ट दशमलव विभाजक का उपयोग कर:

string longPattern = culture.DateTimeFormat.LongTimePattern; 
if (!longPattern.Contains(":ss")) 
{ 
    // ???? Throw an exception? Test this with all system cultures, but be aware 
    // that you might see custom ones... 
} 
// Only do it if the long pattern doesn't already contain .fff... although if 
// it does, you might want to replace it using the culture's decimal separator... 
if (!longPattern.Contains(".fff")) 
{ 
    longPattern = longPattern.Replace(":ss", 
     ":ss" + culture.NumberFormat.DecimalSeparator + "fff"); 
} 
string timeText = time.ToString(longPattern, culture); 

मामलों आगे को मुश्किल करने के लिए , कुछ संस्कृतियों में दिनांक समय प्रारूप होते हैं जो उनके स्वरूपण के हिस्से के रूप में अवधि का उपयोग करते हैं। इससे प्लेसहोल्डर को रखना मुश्किल हो जाता है, उदाहरण के लिए अवधि और इसे संस्कृति विशिष्ट दशमलव विभाजक के साथ प्रतिस्थापित करें। इसके अलावा, यह मूल्य को सही जगह पर डालना चाहिए। क्या आप निश्चित रूप से हमेशा चाहते हैं कि तीन अंक हों, भले ही मान एक सटीक दूसरा (या आधे सेकेंड, आदि) हो? यदि नहीं, तो .FFF का उपयोग करें।

मुझे लगता है कि क्यों संस्कृति विशिष्ट दशमलव विभाजक नहीं किया जाता है। मुझे यह अजीब लगता है - वास्तव में, मैंने Noda Time को वैसे ही व्यवहार किया है, भले ही मैं not convinced it's right हूं।

अंत में, इस तरह की समस्या का एक बहुत मौलिक समस्याग्रस्त हैं: अगर एक संस्कृति "आंशिक सेकंड के साथ एक समय" का प्रतिनिधित्व करने के कोई निश्चित तरीका है और आप मिला आंशिक सेकंड का प्रतिनिधित्व करने के है, तो आप सबसे अच्छा करने में सक्षम होने जा रहा है एक कड़वाहट का थोड़ा सा है।

+0

क्या यह मानना ​​सुरक्षित है कि सभी संस्कृतियां उपयोग करती हैं: एसएस और नहीं: एस? मैं देखता हूं कि यह अपवाद फेंककर इसे संभालेगा। – jcmcbeth

+0

@jcmcbeth: पास। शायद। आप सभी * सिस्टम * संस्कृतियों के लिए काफी आसानी से जांच सकते हैं, लेकिन यह किसी को अपनी पागल संस्कृति सेटिंग्स के साथ आने से नहीं रोकता है। –

2

मुझे लगता है कि यह है कि तुम क्या आप

var now = DateTime.Now; 
var seconds = now.TimeOfDay.TotalSeconds % 60; 
var timeText = string.Format(CultureInfo.GetCultureInfo("fr-FR"), 
          "{0:d} {0:hh:mm:}{1:00.000}", now, seconds); 

या आवश्यकता के करीब कुछ दे देंगे बस का उपयोग

var timeText = string.Format(CultureInfo.CurrentCulture, 
          "{0:d} {0:hh:mm:}{1:00.000}", now, seconds); 

उदाहरण के लिए

  • fr-एफआर: 20/03/2012 10: 20: 10,088
  • एन-जीबी: 20/03/2012 10: 21: 08.724
  • en-US: 2012/03/20 10: 21: 24,470
+0

मुझे लगता है कि यह समाधान कस्टम स्वरूपित तारों के लिए प्रदान किए गए एक से अधिक स्पष्ट है। – jcmcbeth

-1

आम तौर पर मैं वर्तमान संस्कृति बदल सकते हैं और मैं आपरेशन की आवश्यकता है।

System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture; 
try 
{ 
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

    string timestr = DateTime.Now.ToString(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
finally 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = before; 
} 
+1

1) यह समस्या को कैसे हल करता है? 2) आपको क्यों लगता है कि संस्कृति में 'ToString' के पैरामीटर के रूप में गुजरने से बेहतर है? – CodesInChaos

+0

मुझे लगता है कि इस विधि के साथ आपने संस्कृति चुना है और आप केवल स्वरूपण समस्या पर ध्यान केंद्रित कर सकते हैं। हां आप ToString() के अंदर संस्कृति को पारित कर सकते हैं, लेकिन यदि आपके पास करने के लिए अधिक स्वरूपण ऑपरेशन है, तो मैं अपना रास्ता उपयोग करना पसंद करता हूं। यह केवल एक अलग राय है – pluka

+0

समस्या यह है कि DateTime.ToString() दशमलव विभाजक को स्थानीयकृत नहीं करता है या मानक प्रारूप है जो fractional सेकंड दिखाता है। – jcmcbeth