Format Une Plage De Temps, Avec Les Années
J'ai une classe avec 2 propriétés de date: FirstDay
et LastDay
. LastDay
est nullable. Je voudrais générer une chaîne de caractères dans le format de "x year(s) y day(s)"
. Si le nombre total d'années de moins d ' 1, je voudrais d'omettre l'année la section. Si le nombre total de jours à moins de 1, je voudrais d'omettre le jour de la section. Si l'une d'années, de jours sont 0, ils doivent dire "jour/année", plutôt que "jours/années", respectivement.
Exemples:
2.2 ans: "2 ans 73 jours"
1.002738 ans: "1 an 1 jour"
0.2 années: "73 jours"
2 years: "2 ans"
Ce que j'ai fonctionne, mais c'est long:
private const decimal DaysInAYear = 365.242M;
public string LengthInYearsAndDays
{
get
{
var lastDay = this.LastDay ?? DateTime.Today;
var lengthValue = lastDay - this.FirstDay;
var builder = new StringBuilder();
var totalDays = (decimal)lengthValue.TotalDays;
var totalYears = totalDays / DaysInAYear;
var years = (int)Math.Floor(totalYears);
totalDays -= (years * DaysInAYear);
var days = (int)Math.Floor(totalDays);
Func<int, string> sIfPlural = value =>
value > 1 ? "s" : string.Empty;
if (years > 0)
{
builder.AppendFormat(
CultureInfo.InvariantCulture,
"{0} year{1}",
years,
sIfPlural(years));
if (days > 0)
{
builder.Append(" ");
}
}
if (days > 0)
{
builder.AppendFormat(
CultureInfo.InvariantCulture,
"{0} day{1}",
days,
sIfPlural(days));
}
var length = builder.ToString();
return length;
}
}
Est-il une manière plus concise de le faire (mais toujours lisible)?
Vous devez vous connecter pour publier un commentaire.
Un
TimeSpan
n'a pas un bon concept de "ans" parce que cela dépend de début et de fin. (Mois est similaire à la façon dont de nombreux mois, y-a 29 jours? Eh bien, ça dépend...)Pour donner un plug sans vergogne, mon Noda Temps projet fait vraiment simple:
De sortie:
return (iYear > 0 ? $"{iYear} years, " : "") + (iMonths > 0 ? $"{iMonths} months, " : "") + (iDays > 0 ? $"{iDays} days" : "").Trim(' ', ',');
pour le nettoyage de la sortie. Grande solution simpleJe ne voudrais pas faire cela avec un
TimeSpan
. Date de mathématiques devient délicat dès que vous allez au-delà de jours, parce que le nombre de jours dans un mois et de jours dans une année n'est plus constante. C'est probablement pourquoiTimeSpan
ne contient pas de propriétés pourYears
etMonths
. Je serait plutôt de déterminer le nombre d'années/mois/jours, etc entre les deuxDateTime
de valeurs et d'afficher les résultats en conséquence.365.242M
jours par an.TimeSpan
peuvent le faire), alors il serait décent devis, mais peut être désactivé en un seul jour dans certains cas.Je pense que cela devrait fonctionner:
int
, mais en divisant par plat de dix mille coulé sous pression pour un Int. C'est presque équivalent àdateValue1.Year - dateValue2.year
en termes de précision. Le résultat de ce serait un unique nombre indiquant combien d'années ont complètement passé indépendamment de toute possibilité de 354 jours de fuite. Sémantiquement, c'est aussi très douteuse.