2013-04-12 4 views
0

Tous,C# ASP.NET à l'aide TimeSpan pour limiter les heures pour se connecter à un site Web

Lorsqu'un client se connecte sur mon site, je veux montrer combien le temps restant jusqu'à ce que le journal des temps de liaison sur.

Utilisation de la structure TimeSpan en C#, pour une raison quelconque, je ne peux pas comprendre comment faire cette tâche:

TimeSpan diff = (DateTime.Now - orderDate ); 

Lorsque les journaux des clients dans, je veux montrer au client combien de temps il/elle reste à se connecter ... "vous avez 3 heures 33 minutes jusqu'à ce que ce lien expire." ... "Vous avez 2 heures 25 minutes jusqu'à ce que ce lien expire" etc.

Une fois que 4 heures sont atteintes, lorsque le client se connecte, je vais le rediriger vers un désolé ... le lien a dépassé la page.

donc un code psudo pourrait être ...

if (diff.Hours >= 4) 
{ 
response.redirect("log_in_timed_out.aspx"); 
} 
else 
{ 
lblTimeRemaining.Text = "You have " + diff.Hours + " hours and " + diff.Minutes + " minutes remaining until the link times out."; 
} 

Ce code psudo fait les heures et les minutes comptent au lieu de descendre à 0. Donc, je me connecte et il dit que vous avez 1 heures 33 minutes, 2 heures 12 minutes, etc. parce que le TimeSpan me donne la différence entre les deux dates. Et je veux qu'il compte jusqu'à 0 comme 3 heures 23 minutes, 2 heures 15 minutes, 1 heure 5 minutes, etc.

Comment puis-je montrer combien de temps il reste au client chaque fois qu'il se connecte en utilisant la structure TimeSpan et comptez-vous à 0?

merci pour vos commentaires.

+2

Vous devriez utiliser 'UtcNow' au lieu de' Now', sinon vous aurez des clients fâchés qui n'auront que 3h en raison de la commutation DST. – CodesInChaos

+0

Quel est votre problème? Votre pseudo-code me va bien. Personnellement, je ne voudrais pas les rediriger, mais plutôt montrer l'erreur en place. – CodesInChaos

+0

Je veux que lblTimeRemaining affiche le décompte du temps. Par exemple, 4 heures 00 minutes, 3 heures 15 minutes, 2 heures 13 minutes, etc. Si j'utilise le code psudo ... ça compte, pas en bas. Donc cette ligne: – Frekster

Répondre

3

Je recommande de garder tous les DateTime s internes dans UTC, et convertir seulement aux heures locales pour l'affichage. Donc j'utilise DateTime.UtcNow au lieu de DateTime.Now et je suppose que orderTime est aussi en UTC.

Je calcule d'abord l'heure à laquelle le lien expire, puis le temps qui reste avant.

DateTime expirationTime = orderTime.AddHours(4); 
TimeSpan timeRemaining = expirationTime - DateTime.UtcNow; 
if(timeRemaining<TimeSpan.Zero) 
    Error("Expired"); 
else 
    Write("Remaining {0} hours {1} minutes",timeRemaining.Hours, timeRemaining.Minutes); 

Pour mieux testabilité il peut être utile de ne pas appeler DateTime.UtcNow/.Now en ligne, mais de passer de la valeur. Mais comme je ne connais pas le code et l'architecture environnants, je suis allé avec l'approche simple.

+0

merci! Exactement ce que j'étais après et merci d'avoir signalé le Frekster

+0

Pour d'autres lisant ... la ligne qui lit TimeSpan timeRemaining = orderTime - DateTime.UtcNow; N'est pas correct ... il devrait lire TimeSpan timeRemaining = expirationTime - DateTime.UtcNow; - Il devrait utiliser expirationTime et non orderTime. – Frekster

+0

Correction de @Frekster – CodesInChaos

1

Quelque chose comme ça, puisque vous savez que la limite est de 4 heures, ajouter les 4 heures à ORDERDATE puis prendre juste la différence entre UtcNow et la condition devrait changer .....

TimeSpan diff = (orderDate.AddHours(4) - DateTime.UtcNow); 


if (diff < TimeSpan.Zero) 
{ 
    response.redirect("log_in_timed_out.aspx"); 
} 
else 
{ 
    lblTimeRemaining.Text = "You have " + diff.Hours + " hours and " + diff.Minutes + " minutes remaining until the link times out."; 
} 
+0

'diff.Les heures <= -1' ne fonctionnent pas. 'diff.Hours' sera égal à' 0' pendant une heure après l'expiration. – CodesInChaos

+0

true ... puis diff.Minutes <= -1. Mais je vois beaucoup mieux votre TimeSpan.Zero – jjchiw

+0

'diff.Minutes <= -1' - Ensuite, le lien redeviendra de temps en temps fonctionnel à nouveau pendant une minute, parce que c'est' 0' pour une minute toutes les heures. Vous pouvez utiliser 'TotalSeconds' à la place, ou continuer à travailler avec' TimeSpan's. – CodesInChaos

Questions connexes