Je convertissez une petite application msaccess en une application ASP.NET basée sur le Web, en utilisant C # 3.5. Je me demandais quelle est la meilleure façon de travailler avec des dates dans C #, lors de la conversion de certains de ce code VBA sur C #.
Voici un exemple du code VBA: p>
public DateTime CalculateCoverageOne(DateTime dateEffDateOne, DateTime dateCurrentDate, DateTime dateEndDateOne) { if (dateCurrentDate.Date <= dateEndDateOne.Date) { return null; //Get "cannot convert null to System.DateTime because it is a non-nullable value type" error } else { if (dateCurrentDate.Date <= dateEndDateOne) { return dateCurrentDate.Subtract(dateEffDateOne); //Gets error "cannot implicitly convert system.timepsan to system.datetime } else { return dateEndDateOne.Subtract(dateEffDateOne.AddDays(1)); //Gets error "cannot implicitly convert system.timepsan to system.datetime } } }
5 Réponses :
Obtenez la trajectoire temporelle, puis soustrayez-la de la dateTime pour obtenir la date de votre choix. Pour votre déclaration intérieure IF, cela ressemblerait à ceci: EDIT: Vous pouvez également vouloir retourner datetime.maxvalue et avoir la fonction d'appelage de la fonction max, au lieu de renvoyer Null. p> p>
Votre code reviendra toujours sur DateFefferateOne en conséquence, pas une différence entre les dates. Je suppose que ce n'est pas ce que @ Program247365 veut.
Je ne crois pas que c'est ce que l'OP a demandé. Il a besoin de datetime, mais s'il doit stocker des périodes de temps, il devrait utiliser Timespan.
Impossible de convertir NULL en System.DateTime, car il s'agit d'une valeur nominale non nullable type "Erreur em> the DateTime code> est un type type em>, ce qui signifie qu'il ne peut pas contenir une valeur nulle. Pour contourner cela, vous pouvez faire l'une des deux choses; soit renvoyer
datetime.minvalue code> et test pour cela lorsque vous souhaitez utiliser la valeur, ou modifier la fonction pour renvoyer
DateTime? code> (notez le point d'interrogation), qui est une nullable
datetime code>. La date nullable peut être utilisée comme ceci: p>
return dateEffDateOne.AddDays(-1);
> DateCurrentDate.Subrer (DatecurrentDate.Subrent (DateFEffdat eone)) DatecurrentDate- (DateCurrentDate-DateFeffDateOneOne) == Datefefferdat eone Je suppose que ce n'est pas ce que @ Program247365 veut.
@Vladv: Je pense que tu as raison. Comme je n'ai aucune idée de la manière dont les différentes dates de l'échantillon de code d'origine se rapportent les unes aux autres, je ne pouvais pas vraiment comprendre quel résultat attendu, alors supprimé cette ligne de ma réponse.
DateTime est un Type de valeur . Donc, vous ne pouvez pas attribuer NULL à DateTime. Mais vous pouvez utiliser une valeur spéciale comme DateTime.Minvalue pour indiquer tout ce que vous essayiez d'indiquer par NULL. P>
DateTime représente une date (et une heure), comme "le 22 juillet 2009". Cela signifie que vous ne devriez pas utiliser ce type pour représenter un intervalle de temps, comme "9 jours". Timespan est le type destiné à cela. P>
datecurrentDate.sutube (DateFeffDateOneOne) em> (ou, équivalent, DatecurrentDate-DateFeffDateOne em>) est une différence entre deux dates, c'est-à-dire, intervalle de temps. Donc, je vous suggère de modifier le type de retour de votre fonction à TIMPAN. P>
Timespan est également un type de valeur, vous pouvez donc utiliser, par exemple, Timespan.zero au lieu de NULL. p>
On dirait que votre VB renvoie réellement une durée de temps, probablement en jours. Voici la traduction directe la plus proche:
public int CalculateCoverageOne(DateTime dateCurrentDate, DateTime dateEffectiveDate, DateTime dateEffDateOne, DateTime dateEndDateOne) { TimeSpan ts; if (dateEffDateOne == DateTime.MinValue) { ts = TimeSpan.Zero; } else if (dateEffectiveDate <= dateEndDateOne) { ts = dateCurrentDate - dateEffDateOne; } else { ts = (dateEndDateOne - dateEffDateOne) + new TimeSpan(1, 0, 0, 0); } return ts.Days; }
Après quelques excellentes réponses (j'ai eu la chance de voter des gars), j'ai enfin martelé ce que je pense être ma réponse. Il s'avère que le retour d'un Int, comme le nombre de jours, est ce qui a fonctionné pour moi dans cette situation.
Merci à tous, pour avoir fourni vos réponses géniales. Cela m'a aidé à monter sur la bonne voie. P>
Vous voulez probablement dire datefreftefeftefeftateOne.equals (DateTime.minvalue) plutôt que Timespan.zero. En pratique, ils sont la même chose (stockée comme 0L), mais vous ne devriez pas compter sur cette coïncidence.
Je t'ai eu. Merci pour le commentaire.