2009-11-12 6 views
0

I J'ai un fuseau horaire d'un utilisateur qui doit être converti en nombre total de minutes pour être stocké dans la base de données. J'ai le code suivant et il semble très moche. Je suis nouveau à C# et je me demandais s'il y avait une meilleure façon de le faire.Validation d'une chaîne de fuseau horaire et retour sous forme de minutes

string tz = userList.Rows[0][1].ToString().Trim(); 
    //Timezones can take the form of + or - followed by hour and then minutes in 15 minute increments. 
    Match tzre = new Regex(@"^(\+|-)?(0?[0-9]|1[0-2])(00|15|30|45)$").Match(tz); 
    if (!tzre.success) 
    { 
     throw new 
      myException("Row 1, column 2 of the CSV file to be imported must be a valid timezone: " + tz); 
    } 
    GroupCollection tzg = tzre.Groups; 
    tz = Convert.ToInt32(tzg[0].Value + Convert.ToString(Convert.ToInt32(tzg[1].Value) * 60 + Convert.ToInt32(tzg[2]))).ToString(); 
+0

Après quelques recherches, j'ai trouvé TimeSpan. – kzh

+0

Vous savez est une valeur DateTime pour les bases de données (et le stocker comme UTC). Peut-être mieux alors stocker les minutes – RvdK

+0

Pouvez-vous donner un exemple de ce qui est dans userList.Rows [0] [1] .ToString()? – GenericTypeTea

Répondre

0
string tz = userList.Rows[0][1].ToString().Trim(); 
//Timezones can take the form of + or - followed by hour and then minutes in 15 minute increments. 
Match tzre = new Regex(@"^(\+|-)?(0?[0-9]|1[0-2])(00|15|30|45)$").Match(tz); 
if (!tzre.Success) 
{ 
    throw new 
     myException("Row 1, column 2 of the CSV file to be imported must be a valid timezone: " + tz); 
} 
GroupCollection tzg = tzre.Groups; 
tz = (new TimeSpan(int.Parse(tzg[1].Value + tzg[2].Value), int.Parse(tzg[3].Value), 0).TotalMinutes).ToString(); 
0

Essayez de régler les différents groupes à

new TimeSpan(h, m, 0).TotalMinutes(); 
1

Il me semble bon. Je voudrais juste citer les groupes (pour plus de clarté):

Match tzre = new Regex(@"^(?<sign>\+|-)?(?<hour>0?[0-9]|1[0-2])(?<mins>00|15|30|45)$").Match(tz); 

Et peut-être changer votre conversion:

tz = (tzg["sign"].Value == "+" || tzg["sign"].Value == "" ? 1 : -1) 
    * int.Parse(tzg["hour"].Value) * 60 
    + int.Parse(tzg["mins"]) 
+0

Nestor, int.Parse() est plus préférable que Convert.ToInt32()? Ou est-ce juste une question de choix. Personnellement, je pense que j'aime int.Parse mieux maintenant que vous m'avez présenté, parce que c'est plus court et je pense que c'est plus lisible. – kzh

+1

int.Parse() convertit uniquement les chaînes en int. Convert.ToInt32() convertit toutes sortes de choses en int. Par conséquent, il y a beaucoup de surcharges. Si le type de données que vous avez fourni n'a pas de surcharge, il utilise Convert.ToInt32 (objet) et il doit faire un tas de comparaisons en temps réel pour comprendre comment convertir un objet. Cela peut donc être un peu plus long si vous n'utilisez pas une surcharge spécifique. – Nestor

+0

Je m'attends à accepter une réponse ... J'espère que quelqu'un affichera une solution meilleure ou plus élégante. – kzh