11
votes

CultureInfo & DateTimeInfo: Comment vérifier si le temps est de 24 heures?

Je modifie une application Web globalisée qui utilise stocké cultureInfo pour chaque utilisateur connecté.

Le client souhaiterait que la saisie de données temporelle soit localisée. L'affichage n'est pas un problème car le formatage est déjà disponible. Cependant, j'ai besoin de détecter si le culture actuel est pour une heure de 24 heures ou AM / PM afin que je puisse afficher les zones d'entrée correctes (pas seulement un champ de texte).

Mon issue initiale était de vérifier la propriété DateTimeInfo de CultureInfo et de voir si la courte -Mepattern contenait une capitale H ou une minuscule H, mais cela ne se sentait pas suffisamment robuste pour moi.

Y a-t-il une meilleure façon? J'ai lu les propriétés de la classe des deux mais sauf si je manque quelque chose, je ne peux voir aucune méthode ou propriétés existantes.


2 commentaires

Merci@mlessard - Vérification d'un personnage échappé est une bonne idée. Je ne le ferai probablement pas à ce stade car nous n'utilisons pas de cultures personnalisées, tout est assez simple.


C'est le code que j'ai utilisé pour créer cette fonctionnalité comme méthode d'extension: utilisation du système; en utilisant system.globalisation; Espace de noms My.extensions {Public Static Class CultureInfoextensions {Public Static Bool IS24HourTime (cette culture de culture) {retour cultural.dateTimeformat.shorttimeppattern.Contains ("h"); }}}


3 Réponses :


7
votes

Je ne pense pas qu'il y ait un meilleur moyen d'obtenir cette information. Le motif de temps pour une culture pourrait contenir quoi que ce soit (un utilisateur pourrait même créer une culture personnalisée dans laquelle le shortimetepattern est "\ hello", puis datetime.tostring () retournerait "bonjour" pour tout moment). Dans ce cas, comment le cadre pourrait-il déterminer si ce cultureInfo est au format 24 heures sur 24 ou 12 heures?

Ainsi, un "code" normal "> DateTimeFormatinfo.shorttimepattern contient nécessairement soit un" H ", soit" H ', sinon l'heure ne sera pas affichée. Je pense que vous pouvez suivre votre idée initiale et vérifier cela. Vous pouvez également vérifier que le 'H' ou 'H' n'est pas échappé avec un \ comme dans mon exemple "\ Hello", car cela ne représenterait pas l'heure :)


0 commentaires

4
votes

La manière la plus robuste est de vérifier si DateTimeFormatinfo.amdesignator est une chaîne vide. XXX


4 commentaires

C'est 'donetimeformatinfo.currentinfo.amdesignator' mais exactement ce dont j'ai besoin


Merci de partager cela! Tout comme une note latérale: cela ne fonctionne malheureusement pas dans l'unité, où "DateTimeFormatinfo.CurrentInfo.amdesignator" contient "AM" même si l'horloge est réglée sur le format de temps de 24 heures (Mac OSX).


Je ne suis pas d'accord avec cette réponse. Je viens d'ouvrir les paramètres de format dans Windows et, comme SM et Symbole PM, choisissez AM et PM et enregistré. Votre code me donne maintenant un sauf en conséquence, mais le système utilise toujours le format 24h. Bien sûr, je l'ai fait manuellement (AM) pour que vous puissiez dire que cela ne compte pas .. Je ne suis pas d'accord :) Cela ne peut pas être appelé la plus robuste.


@Tommix c'était il y a cinq ans (et quelques versions .net) :)



6
votes

Vérification de 'H' / 'H' semble plus robuste que de vérifier le désignateur AM / PM. Un bon exemple est EN-GB: La chaîne de formatage de l'heure est HH: MM et les concepteurs AM / PM sont définis sur AM / PM. Windows affichera l'heure au format 24h! Cela semble être une définition incohérente mais la vérification de 'H' corrigé mon bogue.


0 commentaires