Короче говоря, это зависит от какой точки к какой. В мелкой копии возразите, что B указывает для возражения местоположению A в памяти. В глубокой копии все вещи в объектной ячейке памяти A копируются для возражения ячейке памяти B.
Эта статья Wiki имеет большую схему.
Не полнофункциональная реализация, но она должна подвести вас достаточно близко.
DateTime dtNow = DateTime.Now;
DateTime dtYesterday = DateTime.Now.AddDays(-435.0);
TimeSpan ts = dtNow.Subtract(dtYesterday);
int years = ts.Days / 365; //no leap year accounting
int months = (ts.Days % 365) / 30; //naive guess at month size
int weeks = ((ts.Days % 365) % 30) / 7;
int days = (((ts.Days % 365) % 30) % 7);
StringBuilder sb = new StringBuilder();
if(years > 0)
{
sb.Append(years.ToString() + " years, ");
}
if(months > 0)
{
sb.Append(months.ToString() + " months, ");
}
if(weeks > 0)
{
sb.Append(weeks.ToString() + " weeks, ");
}
if(days > 0)
{
sb.Append(days.ToString() + " days.");
}
string FormattedTimeSpan = sb.ToString();
В конце концов, действительно ли вам нужно сообщить кому-то, что срок действия документа истекает ровно через 1 год, 5 через месяцы, 2 недели и 3 дня? Разве вы не можете сказать им, что срок действия документа истечет через 1 год или через 5 месяцев? Просто возьмите самую большую единицу и произнесите ее больше n.
Объект TimeSpan имеет свойства Days, Hours, Minutes и Seconds, поэтому не составит труда создать фрагмент, который форматирует эти значения в удобную строку.
К сожалению, дни - это самое большое значение. Что-нибудь длиннее, и вам придется беспокоиться о днях в месяце на каждый год ... и т. Д. На мой взгляд, вам лучше останавливаться на нескольких днях (добавленные усилия, похоже, не стоят выгоды).
ОБНОВЛЕНИЕ
... Я решил, что подниму это из своего собственного комментария:
Понятно, но действительно ли «Срок действия этого документа истекает через 10 лет, 3 месяца, 21 день, 2 часа и 30 минут» более полезен или менее глуп? Если бы это было на мое усмотрение, поскольку ни одно из представлений не кажется очень полезным ...
Я ' d оставить срок действия до тех пор, пока дата не станет достаточно близкой (может быть, 30 или 60 дней, если вы беспокоитесь об обновлении документа).
Мне кажется, гораздо лучший выбор UX.
Вероятно, он не сделает все, что вы ищете, но в версии 4 Microsoft будет реализовывать IFormattable
на TimeSpan
.
Для форматирования любого периода, превышающего 1 день (например, месяц / год / десятилетие и т. Д.), Объекта Timespan недостаточно.
Предположим, ваш временной интервал составляет 35 дней, тогда с 1 апреля вы получит один месяц и пять дней, а с 1 декабря - один месяц и четыре дня.
См. как-я-вычислить-относительное-время , заданный ( пользователем номер 1 ) год назад, когда SO был молод и не публично. Это было (вероятно) основанием для отображения текущего возраста для вопросов и ответов SO.