2010-06-10 11 views
10

द्वारा परिभाषित अनुसार 12 या 24 घंटे प्रारूप का उपयोग करके डेटटाइम से दिन का घंटा प्राप्त करें। नेट ने डेटटाइम के लिए ToShortTimeString() फ़ंक्शन में बनाया है जो CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern प्रारूप का उपयोग करता है। यह एन-यूएस के लिए ऐसा कुछ देता है: "5:00 बजे"। 24 घंटे की संस्कृति के लिए डी-डीई के रूप में यह "17:00" वापस आ जाएगा।वर्तमान संस्कृति

जो मैं चाहता हूं वह केवल उस समय (केवल "5 बजे" और "17" उपरोक्त मामलों में वापस आने का एक तरीका है जो हर संस्कृति के साथ काम करता है। ऐसा करने का सबसे अच्छा/साफ तरीका क्या है?

धन्यवाद!

+0

कुछ संस्कृतियां "एच: मिमी" (8:11) का उपयोग करती हैं जबकि अन्य "एचएच: मिमी" (08:11) का उपयोग करते हैं। क्या आप अग्रणी शून्य रखना चाहते हैं या नहीं? – Greg

+0

हम्म .. मैं या तो बस जाऊंगा।लेकिन चूंकि मैं जितना संभव हो सके स्ट्रिंग को रखने की कोशिश कर रहा हूं, इसलिए मैं कोई अग्रणी शून्य पसंद नहीं करूंगा। – InvisibleBacon

उत्तर

6
// displays "15" because my current culture is en-GB 
Console.WriteLine(DateTime.Now.ToHourString()); 

// displays "3 pm" 
Console.WriteLine(DateTime.Now.ToHourString(new CultureInfo("en-US"))); 

// displays "15" 
Console.WriteLine(DateTime.Now.ToHourString(new CultureInfo("de-DE"))); 

// ... 

public static class DateTimeExtensions 
{ 
    public static string ToHourString(this DateTime dt) 
    { 
     return dt.ToHourString(null); 
    } 

    public static string ToHourString(this DateTime dt, IFormatProvider provider) 
    { 
     DateTimeFormatInfo dtfi = DateTimeFormatInfo.GetInstance(provider); 

     string format = Regex.Replace(dtfi.ShortTimePattern, @"[^hHt\s]", ""); 
     format = Regex.Replace(format, @"\s+", " ").Trim(); 

     if (format.Length == 0) 
      return ""; 

     if (format.Length == 1) 
      format = '%' + format; 

     return dt.ToString(format, dtfi); 
    } 
} 
+0

+1, यह बहुत साफ है। सावधान रहें, जैसा कि इंगित किया गया है, कि प्रारूप स्वरूप की लंबाई 1 है, यदि प्रारूप की लंबाई 1 है, और यह डेटटाइमफॉर्मैटइन्फो के लिए परिभाषित प्रारूप विनिर्देशक वर्णों में से एक नहीं है "। इसके अलावा दोहराने की जगहों को तोड़ दें। साथ ही (केवल पूछताछ, मैंने इसे पहले नहीं देखा है) क्या आपको प्रदाता पर शून्य जांच की आवश्यकता है - मुझे लगता है कि प्रलेखन से। GetInstance CurrentInfo देता है यदि प्रदाता शून्य है? – Rawling

+0

यह मूल रूप से वही समाधान है जो रॉयलिंग ने सुझाव दिया, लेकिन रेगेक्स का उपयोग करना। रेगेक्स का उपयोग करके दोहराए गए रिक्त स्थान सुनिश्चित करने का कोई अच्छा तरीका नहीं है? – InvisibleBacon

+0

@ रावलिंग, @InvisibleBacon: फिक्स्ड। अब सामान्य रूप से व्हाइटस्पेस को दोहराया जाता है और उस मामले को संभालता है जहां 'प्रारूप। लम्बाई' 1 है। मैंने अनावश्यक शून्य जांच भी हटा दी है। – LukeH

0

आप डेटटाइम का उपयोग कर सकते हैं। ToString() और प्रारूप tyou एक तर्क के रूप में चाहते हैं।

-1
 
var culture = CultureInfo.CurrentCulture; 
bool uses24HourClock = string.IsNullOrEmpty(culture.DateTimeFormat.AMDesignator); 

var dt = DateTime.Now; 
string formatString = uses24HourClock ? "HH" : "h tt"; 
Console.WriteLine(dt.ToString(formatString, culture)); 

सैम संपादित करें:

यहाँ साबित करने के लिए यह काम नहीं करता कोड है।

var date = new DateTime(2010, 1, 1, 16, 0, 0); 

foreach (CultureInfo cultureInfo in CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures)) 
{ 
    bool amMethod = String.IsNullOrEmpty(cultureInfo.DateTimeFormat.AMDesignator); 
    bool formatMethod = cultureInfo.DateTimeFormat.ShortTimePattern.Contains("H"); 

    if (amMethod != formatMethod) 
    { 
     Console.WriteLine("**** {0} AM: {1} Format: {2} Designator: {3} Time: {4}", 
          cultureInfo.Name, 
          amMethod, 
          formatMethod, 
          cultureInfo.DateTimeFormat.AMDesignator, 
          date.ToString("t", cultureInfo.DateTimeFormat)); 
    } 
} 
+0

यह कई संस्कृतियों में काम नहीं करता है। अक्सर AMDesignator को '?????????' के रूप में परिभाषित किया जाता है 24 घंटे के समय का उपयोग करने वाली संस्कृतियों में शून्य या खाली होने की बजाय। 24 घंटे के समय का उपयोग करने वाली कई संस्कृतियों में अभी भी AMDesignator निर्दिष्ट है। –

+0

आह। मैंने अभी एक संस्कृति की जांच की और पता चला कि एएम/पीएम खाली था। बस माना जाता है कि यह सभी संस्कृतियों पर सुसंगत था। – simendsjo

+0

कुछ संस्कृतियां भी वीडर हैं। उदाहरण: एएफ-जेडए में कोई एएम डिज़ाइनर नहीं है, लेकिन इसमें पीएम डिज़ाइनेटर है, और एचएच के शॉर्टटाइम पैटर्न: एमएम टीटी ... – code4life

4

मैं यह देखने के लिए CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern "h", "hh", "एच", "HH", "टी" या "टीटी" शामिल है, और किस क्रम में जाँच करेगा, और फिर उनसे अपनी खुद की कस्टम प्रारूप स्ट्रिंग बनाएं।

उदा।

  • en-US: नक्शा "h: mm टीटी" को "ज टीटी"
  • ja-जेपी: मानचित्र "एच: mm" के लिए "एच"
  • fr-एफआर: नक्शा "HH: मिमी "से" एचएच "

फिर आपके द्वारा बनाई गई स्ट्रिंग में गुजरने वाले .ToString() का उपयोग करें।

उदाहरण कोड - यह मूल रूप से उन सभी चीजों को स्ट्रिप्स करता है जो टी, टी, एच, एच, और एकाधिक रिक्त स्थान नहीं हैं। लेकिन, जैसा कि नीचे बताया, बस 'एच' के एक स्ट्रिंग विफल हो सकता है ...

string full = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; 
string sh = String.Empty; 
for (int k = 0; k < full.Length; k++) 
{ 
    char i = full[k]; 
    if (i == 'h' || i == 'H' || i == 't' || i == 'T' || (i == ' ' && (sh.Length == 0 || sh[sh.Length - 1] != ' '))) 
    { 
     sh = sh + i; 
    } 
} 
if (sh.Length == 1) 
{ 
    sh = sh + ' '; 
    string rtnVal = DateTime.Now.ToString(sh); 
    return rtnVal.Substring(0, rtnVal.Length - 1); 
{ 
else 
{ 
    return DateTime.Now.ToString(sh); 
} 
+0

जिस समस्या में मैं चल रहा हूं वह है कि डेटटाइम.अब। टॉस्ट्रिंग ("एच") एक प्रारूप अपवाद फेंकता है और मैं मुझे यकीन नहीं है क्यों। – Greg

+0

हाँ, मैंने अभी कुछ कोड मजाक किया है और आप सही हैं: -/ – Rawling

+0

हाँ मैंने यह भी देखा। बहुत अजीब। मैंने अंत में एक स्थान जोड़ने को पाया, इसे ठीक करता है: डेटटाइम.अब। टॉस्ट्रिंग ("एच")। टिमइंड ('')। लेकिन यह बहुत बदसूरत है .. – InvisibleBacon

2

उपयोग करें:

bool use2fHour = 
    CultureInfo 
     .CurrentCulture 
     .DateTimeFormat 
     .ShortTimePattern.Contains("H"); 
0

ओह, मुझे कोई दिलचस्पी होने के लिए नहीं करना चाहता था, लेकिन अब मैं! यहां कोड है जो सभी संस्कृतियों का सम्मान करता है और एएम/पीएम डिजाइनरों को सही स्थिति में प्रस्तुत करता है, साथ ही संस्कृति के आधार पर 24 घंटे के प्रारूप को पहचानता है।

असल में, यह स्थिर विस्तार विधि वर्तमान संस्कृति (कोई पैरामीटर) या निर्दिष्ट संस्कृति लेने के लिए अधिभारित नहीं है।

DateTime.Now.ToTimeString()
DateTime.Now.ToTimeString(someCultureInfo)

कोड से नीचे है, नमूना कार्यक्रम में शामिल हैं:

public static class DateTimeStaticExtensions 
    { 
     private static int GetDesignatorIndex(CultureInfo info) 
     { 
      if (info.DateTimeFormat 
       .ShortTimePattern.StartsWith("tt")) 
      { 
       return 0; 
      } 
      else if (info.DateTimeFormat 
       .ShortTimePattern.EndsWith("tt")) 
      { 
       return 1; 
      } 
      else 
      { 
       return -1; 
      } 
     } 

     private static string GetFormattedString(int hour, 
      CultureInfo info) 
     { 
      string designator = (hour > 12 ? 
       info.DateTimeFormat.PMDesignator : 
       info.DateTimeFormat.AMDesignator); 

      if (designator != "") 
      { 
       switch (GetDesignatorIndex(info)) 
       { 
        case 0: 
         return string.Format("{0} {1}", 
          designator, 
          (hour > 12 ? 
           (hour - 12).ToString() : 
           hour.ToString())); 
        case 1: 
         return string.Format("{0} {1}", 
          (hour > 12 ? 
           (hour - 12).ToString() : 
           hour.ToString()), 
          designator); 
        default: 
         return hour.ToString(); 
       } 
      } 
      else 
      { 
       return hour.ToString(); 
      } 
     } 

     public static string ToTimeString(this DateTime target, 
      CultureInfo info) 
     { 
      return GetFormattedString(target.Hour, info); 
     } 

     public static string ToTimeString(this DateTime target) 
     { 
      return GetFormattedString(target.Hour, 
       CultureInfo.CurrentCulture); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var dt = new DateTime(2010, 6, 10, 6, 0, 0, 0); 

      CultureInfo[] cultures = 
       CultureInfo.GetCultures(CultureTypes.SpecificCultures); 
      foreach (CultureInfo culture in cultures) 
      { 
       Console.WriteLine(
        "{0}: {1} ({2}, {3}) [Sample AM: {4}/Sample PM: {5}", 
        culture.Name, culture.DateTimeFormat.ShortTimePattern, 
        (culture.DateTimeFormat.AMDesignator == "" ? 
         "[No AM]": 
         culture.DateTimeFormat.AMDesignator), 
        (culture.DateTimeFormat.PMDesignator == "" ? 
         "[No PM]": 
         culture.DateTimeFormat.PMDesignator), 
        dt.ToTimeString(culture), // AM sample 
        dt.AddHours(12).ToTimeString(culture) // PM sample 
        ); 
      } 

      // pause program execution to review results... 
      Console.WriteLine("Press enter to exit"); 
      Console.ReadLine(); 
     } 
    } 
-1

DateTime.Hour संपत्ति का उपयोग करें।

संबंधित मुद्दे