7
votes

Convertir le type de données Timespan en DateTime?

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
            }
        }
    }


0 commentaires

5 Réponses :


3
votes

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: xxx

EDIT: Vous pouvez également vouloir retourner datetime.maxvalue et avoir la fonction d'appelage de la fonction max, au lieu de renvoyer Null.


2 commentaires

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.



7
votes

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);


2 commentaires

> 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.



2
votes

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.

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.

datecurrentDate.sutube (DateFeffDateOneOne) (ou, équivalent, DatecurrentDate-DateFeffDateOne ) 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.

Timespan est également un type de valeur, vous pouvez donc utiliser, par exemple, Timespan.zero au lieu de NULL.


0 commentaires

3
votes

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;
}


0 commentaires

1
votes

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. xxx


2 commentaires

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.