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#
Antwort
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);
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
Wenn Sie Datum init ist dt
als
dt = dt.AddMonths((int)(2.5*12));
'AddMonths' nimmt nur' int' –
@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? –
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?
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).
können Sie ein vollständiges Beispiel reg schreiben, was Sie erreichen müssen? – Sachu
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
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. –