2010-09-01 5 views
0

J'essaie de déterminer un TimeSpan (par exemple, temps entre la déconnexion et la connexion), mais avec la mise en garde qu'une partie de chaque jour ne devrait pas être compté (p. ex., ne comptez pas l'heure entre 19 h et 7 h un jour donné). Il est assez facile de supprimer ce délai d'une journée entière, mais quel est le meilleur moyen de vérifier les parties d'une journée (par exemple, l'utilisateur se déconnecte à 18 heures et se reconnecte à 20 heures le même jour) et d'autres cas?C#: Edge Cas lors de la suppression quotidienne d'un sous-jour d'un TimeSpan

ETA: J'ai actuellement obtenu un set-up qui ressemble à ceci:

public class HasProductiveHours 
{ 
    //These fields should represent an hour of the day (in 24-hour format) 
    // in which production should start or stop. 
    public int startProductiveHour; 
    public int endProductiveHour; 
    //Resource type enum 
    public ResourceType resourceType 
    //How often this resource is collected, in seconds 
    public float harvestTime 

    public HasProductiveHours (int startProductiveHour, int endProductiveHour, ResourceType resourceType, int harvestTime) 
    { 
     // Other creation-time things 
     this.startProductiveHour = startProductiveHour; 
     this.endProductiveHour = endProductiveHour; 
     this.resourceType = resourceType; 
     this.harvestTime = harvestTime; 
     TimeSimulator.Instance.SimulateElapsedTime (this); 
    } 
} 

Les instances de cette classe et ses enfants simulent la production d'une ressource toutes les heures (en fonction de la ressource) . Un système est en place pour simuler le temps écoulé depuis la dernière déconnexion de l'utilisateur.

DateTime lastLogoutTime; 

public void Logout() 
{ 
    // Other logout things 
    lastLogoutTime = DateTime.Now; 
} 

public void SimulateElapsedTime (HasProductiveHours toSimulate) 
{ 
    DateTime currentTime = DateTime.Now; 
    TimeSpan timeSinceLogout = currentTime - lastLogout; 
    int unproductiveHours = Math.Abs (toSimulate.startProductionHour - toSimulate.endProductionHour) * timeSinceLogout.Days; 
    timeSinceLogout.Subtract (new TimeSpan (unproductiveHours, 0, 0); 
    double secondsElapsed = timeSinceLogout.TotalSeconds; 
int harvestsElapsed = (int)(secondsElapsed/toSimulate.harvestTime); 
PlayerData.Instance.AddResource (toSimulate.resourceType, harvestsElapsed); 
} 
+1

Vous avez pas vraiment donné nous avons assez de l'impression que votre API est capable de vous aider correctement. –

Répondre

2

Quelques étapes devraient facilement corriger cela:

  1. Vérifiez le temps de fermeture de session - voir si elle est 7 heures-19 heures (La méthode heure vous donne le nombre d'heures depuis minuit Vous voulez. pour voir si c'est> = 7 et < = 19). Si ce n'est pas le cas, déplacez l'heure à 7h. Devrait être assez facile à faire - Si l'heure est < 7am, changez l'heure à 7am. Si le temps est supérieur à 19 heures, changer l'heure à 7 heures le lendemain

  2. Vérifier le temps de connexion - voir si elle est 7 heures-19 heures. Si ce n'est pas le cas, remettez l'heure à 19 heures. Devrait être assez facile à faire - Si l'heure> 19 heures, mis à 19 heures, si l'heure est < 7 heures, changer l'heure à 19 heures la veille

  3. Assurez-vous déconnecter de temps < temps de connexion. Sinon, tout le temps déconnecté était pendant les aucune heure de comptage, de sorte que votre laps de temps doit être réglé sur 0. Si votre temps de déconnexion < connexion, il suffit de les soustraire pour obtenir votre timespan

Ceci pour la situation décrit dans le commentaire:

Si les numéros de jour sont maintenant les mêmes ce sont les mesures que je prendrais:

  1. Créer une nouvelle datetime avec la date outs de déconnexion, et un temps de 1900. Soustraire la nouvelle date de la date de déconnexion - cela vous donnera Durée jusqu'à la fin de la journée

  2. Déplacez la date de déconnexion à 7h le lendemain. Si la déconnexion et la connexion sont maintenant sur le même jour, il suffit de soustraire la déconnexion de la connexion, c'est le laps de temps pour ce jour. Si ce n'est pas la même date, répétez l'étape 1

  3. Ajoutez les intervalles de temps générés à l'étape 1 et à l'étape 2 ensemble. Cela donne votre temps total

Par exemple: Je LOGOUT 1er janvier à 16h00. Je me connecte 2 janv à 10:00

Le temps que je le 1 janvier LOGOUT pendant les heures de suivi est (3 heures 1 janv, 19:00 - Jan 1, 16:00)

je déplace le temps de fermeture de session au 2 janvier, à 07h00.

Le jour de fermeture de session est 2, et le jour de connexion est 2, maintenant je peux les soustrais

Le temps que je déconnexions dans un Jan 2 pendant les heures de suivi est 3 heures (2 Jan, 10:00 - Jan 2, 07:00)

Maintenant, je les ajoute et obtenir 6 heures de temps de déconnexion pendant les heures de suivi.

+0

Ces suggestions ont beaucoup aidé, mais elles ne semblent pas couvrir le cas où la connexion et la connexion ne sont pas modifiées (c.-à-d. Déconnectées entre 0700 et 1900 et connectées entre 0700 et 1900) et moins de 24 heures se sont écoulées. Par exemple, si je me déconnecte à 1800 le 1er janvier et que je me connecte à 0800 le 2 janvier, le nombre de jours écoulés est 0, mais un cycle complet d'heures improductives doit être déduit. Comment puis-je différencier ce cas de, disons, de déconnexion à 0800 le 1er janvier et de se reconnecter à 0900 le 1er janvier? – burnumd

+0

voir mon édition. J'ai ajouté une logique pour gérer quand les dates ne sont pas les mêmes – thorkia

+0

Brilliant! Merci beaucoup. – burnumd

0

@thorkia a de bonnes suggestions.

Vous pouvez également calculer le décalage horaire, puis additionner (à partir d'un autre tableau) le total de non-production/non-temps couvert et soustraire ce total du total.

Alors

= 8 heures-6 heures 2 heures au total

à 7 heures du matin = 6 heures du matin 1 heure non-temps

résultat = 1 heure au total en temps réel

+0

Idée intéressante ... Je n'ai jamais pensé à le faire de cette façon. Cela fonctionnerait très bien aussi. – thorkia