2016-06-02 5 views
3

Wie konvertiert man eine Dezimalzahl (z. B. 2.5) in Jahr und Monat (2 Jahre und 6 Monate) und fügt sie zu einem bestimmten Datum hinzu? Ich habe versucht DateTime.TryParse und es hat nicht funktioniert.Dezimalzahl zu Datum hinzufügen - C#

+0

können Sie ein vollständiges Beispiel reg schreiben, was Sie erreichen müssen? – Sachu

+0

Es besteht die Möglichkeit, dass die Dezimalzahl etwa 2 Jahre, 5 Monate, 10 Tage, 11 Stunden ... ergibt. Es gibt also keinen direkten Weg, dies zu lösen. Sie können wiederum eine Funktion erstellen, die diese Berechnung selbst durchführt, und sie dann mithilfe der TimeSpan-Methode hinzufügen. – jitendragarg

+0

Ich stimme @jitendragarg zu. Shon's Antwort ist gut basierend auf Ihren Eingaben, aber es gibt keine _perfect_ Lösung für general. Sogar das Umwandeln in "int" _might_ erzeugt dieselben Ergebnisse für verschiedene Eingaben wie "2.5" und "2.51". Beide werden 2 Jahre und 6 Monate generieren, aber der zweite ist ein bisschen mehr als das. –

Antwort

0
decimal x =(decimal)2.5; 

int nbYear = Convert.ToInt16(x); 
var y = x - Math.Truncate(x); 

int nbMonth =Convert.ToInt16 (y*12); 
// MessageBox .Show (string.Format (" {0} years and {1} months ",nbYear ,nbMonth)); 
DateTime dat=DateTime .Now ; // or given date 
DateTime dat2 = dat.AddYears(nbYear).AddMonths(nbMonth); 
9

Wenn Sie es seit Jahren verwenden, multiplizieren Sie den Float, den Sie haben, um 12. 2.5 wird 30 Monate. Verwenden Sie dann die Funktion addmonths. Wenn ich 5 eingeben, dann wird es 60 Monate hinzufügen, die 5 Jahre

2

Wenn Sie Datum init ist dt als

dt = dt.AddMonths((int)(2.5*12)); 
+3

'AddMonths' nimmt nur' int' –

+0

@Manfred Radlwimmer - danke, geändert. Obwohl es irgendwo zuvor überprüft werden muss, gibt die Eingabe die richtige Anzahl von Monaten. ZB 2.4 gibt 5 oder 6 Monate? –

2

Normalerweise könnte man einfach eine TimeSpan hinzufügen oder eine der Add Methoden verwenden, wie folgt aus:

decimal yearsToAdd = (decimal)2.5; 

int years = (int)Math.Floor(yearsToAdd); 
decimal months = yearsToAdd - years; 
int actualMonths = (int) Math.Floor(months * 12); // or Ceiling or Round 

DateTime x = DateTime.Now.AddYears(years).AddMonths(actualMonths); 

Das Problem ist, dass, wenn Sie Dezimalzahlen keine exacat Anzahl der Monate ergeben, wie würden Sie, wie lange zB wissen ein halber Monat ist? 28.0/2, 29.0/2, 30.0/2 oder 31.0/2? Würdest du die Länge des Monats nehmen, mit dem du angefangen hast, oder eines der möglichen zwei Monate, in denen du am Ende bist?

0

Wenn Monat Ihre kleinste Einheit ist dann die Lösung, wie sie von vielen spitz, zu multiplizieren Zahl von 12. Eine genauere Alternative wäre Zecken zu verwenden.

decimal years=3.14592M; // No idea where this came from. 
long ticks = (long)(356.0M * (decimal)TimeSpan.TicksPerDay * years); 
DateTime futureDate=DateTime.Today.AddTicks(ticks); 

Beachten Sie, dass die Lösung keine Schaltjahre kompensiert. Es ist nicht schwierig, sie zu erweitern - Sie müssen die Anzahl der Schaltjahre in dem Zeitraum berechnen und den Durchschnitt anstelle von 356,0 M verwenden, um die Ticks pro Jahr zu berechnen (d. H. Durchschnittliche Anzahl der Tage pro Jahr * Ticks pro Tag).