Obtenez seulement l’heure de la journée à partir de DateTime en utilisant le format 12 ou 24 heures défini par la culture actuelle

.Net a la fonction intégrée ToShortTimeSsortingng () pour DateTime qui utilise le format CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern. Il renvoie quelque chose comme ceci pour en-US: “17h00”. Pour une culture de 24 heures telle que de-DE, il reviendrait à “17h00”.

Ce que je veux, c’est un moyen de simplement revenir à l’heure (donc “17 heures” et “17” dans les cas précédents) qui fonctionne avec toutes les cultures. Quelle est la meilleure façon / la plus propre de faire cela?

Merci!

// displays "15" because my current culture is en-GB Console.WriteLine(DateTime.Now.ToHourSsortingng()); // displays "3 pm" Console.WriteLine(DateTime.Now.ToHourSsortingng(new CultureInfo("en-US"))); // displays "15" Console.WriteLine(DateTime.Now.ToHourSsortingng(new CultureInfo("de-DE"))); // ... public static class DateTimeExtensions { public static ssortingng ToHourSsortingng(this DateTime dt) { return dt.ToHourSsortingng(null); } public static ssortingng ToHourSsortingng(this DateTime dt, IFormatProvider provider) { DateTimeFormatInfo dtfi = DateTimeFormatInfo.GetInstance(provider); ssortingng 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.ToSsortingng(format, dtfi); } } 

Je voudrais vérifier si CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern contient “h”, “hh”, “H”, “HH”, “t” ou “tt”, et dans quel ordre, puis créez votre propre format personnalisé chaîne de ceux-ci.

par exemple

  • en-US: map “h: mm tt” à “h tt”
  • ja-JP: carte “H: mm” à “H”
  • fr-FR: carte “HH: mm” à “HH”

Ensuite, utilisez .ToSsortingng () en transmettant la chaîne que vous avez construite.

Exemple de code – cela supprime essentiellement tout ce qui n’est pas t, T, h, H et plusieurs espaces. Mais, comme indiqué ci-dessous, seule une chaîne de “H” pourrait échouer …

 ssortingng full = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; ssortingng sh = Ssortingng.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); } 

Utilisez ceci:

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

vous pouvez utiliser DateTime.ToSsortingng () et fournir le format que vous souhaitez en tant qu’argument.

Ugh, je ne voulais pas être intéressé, mais maintenant je le suis! Voici le code qui respecte toutes les cultures et place les identifiants AM / PM dans la bonne position, ainsi que la reconnaissance du format 24 heures, le tout en fonction de la culture.

Fondamentalement, cette méthode d’extension statique est surchargée pour prendre la culture actuelle (aucun paramètre) ou une culture spécifiée.

DateTime.Now.ToTimeSsortingng()
DateTime.Now.ToTimeSsortingng(someCultureInfo)

Le code est ci-dessous, comprend un exemple de programme:

  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 ssortingng GetFormattedSsortingng(int hour, CultureInfo info) { ssortingng designator = (hour > 12 ? info.DateTimeFormat.PMDesignator : info.DateTimeFormat.AMDesignator); if (designator != "") { switch (GetDesignatorIndex(info)) { case 0: return ssortingng.Format("{0} {1}", designator, (hour > 12 ? (hour - 12).ToSsortingng() : hour.ToSsortingng())); case 1: return ssortingng.Format("{0} {1}", (hour > 12 ? (hour - 12).ToSsortingng() : hour.ToSsortingng()), designator); default: return hour.ToSsortingng(); } } else { return hour.ToSsortingng(); } } public static ssortingng ToTimeSsortingng(this DateTime target, CultureInfo info) { return GetFormattedSsortingng(target.Hour, info); } public static ssortingng ToTimeSsortingng(this DateTime target) { return GetFormattedSsortingng(target.Hour, CultureInfo.CurrentCulture); } } class Program { static void Main(ssortingng[] 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.ToTimeSsortingng(culture), // AM sample dt.AddHours(12).ToTimeSsortingng(culture) // PM sample ); } // pause program execution to review results... Console.WriteLine("Press enter to exit"); Console.ReadLine(); } } 
 var culture = CultureInfo.CurrentCulture;
 bool utilise24HourClock = ssortingng.IsNullOrEmpty (culture.DateTimeFormat.AMDesignator);

 var dt = DateTime.Now;
 ssortingng formatSsortingng = uses24HorClock?  "HH": "h tt";
 Console.WriteLine (dt.ToSsortingng (formatSsortingng, culture));

Le assembly de Sam:

Voici le code pour prouver que cela ne fonctionne pas.

 var date = new DateTime(2010, 1, 1, 16, 0, 0); foreach (CultureInfo cultureInfo in CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures)) { bool amMethod = Ssortingng.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.ToSsortingng("t", cultureInfo.DateTimeFormat)); } } 

Essayez d’utiliser la propriété DateTime.Hour.