Сравнение даты c #, возвращающее объект DateTime - PullRequest
2 голосов
/ 07 мая 2011

Учитывая объект DateTime (последняя покупка), я могу сравнить с DateTime.Now, чтобы вернуть новый объект DateTime, который содержит годы, месяцы, дни, часы и секунды?

Я могу сравнивать даты и возвращать количество лет, но мне нужны все детали с точностью до секунды.

Любая помощь или примеры будут оценены

Ответы [ 7 ]

2 голосов
/ 07 мая 2011

Вы не хотите иметь новый DateTime объект. То, что вы хотите иметь, это TimeSpan. И это то, что вы получите, если вычтете DateTime экземпляров:

TimeSpan difference = DateTime.Now - yourDate
1 голос
/ 07 мая 2011

Нет, вы не можете, потому что DateTime представляет абсолютную точку во времени, а не промежуток времени. Правильный объект, который нужно использовать для разницы: TimeSpan. Он имеет свойства для всех соответствующих единиц времени. Вы можете получить один, просто вычитая два DateTime s:

TimeSpan ts = DateTime.Now - purchaseDate;
0 голосов
/ 08 мая 2011

Если вы хотите годы и месяцы, вы должны написать свой собственный код. На самом деле сложно написать этот код с выводом, который на 100% корректен из-за различных проблем в високосном году.

Вот несколько хитрых особых случаев (Примечание 2012 - високосный год, 2011 - нет):

  1. Между 28 февраля 2010 года и 28 февраля 2011 года - это 1y, 0m, 0d
  2. Между 28 февраля 2011 года и 28 февраля 2012 года - это 1 год, 11 м, 28 дней
  3. Между 28 февраля 2011 и 29 февраля 2012 - это 1y, 0m, 0d
  4. Между 29 февраля 2012 и 28 февраля 2013 - это 1y, 0m, 0d
  5. Между 10 февраля 2011 и 9 марта 2011 - это 0y, 0m, 27d
  6. Между 10 февраля 2012 и 9 марта 2012 - это 0y, 0m, 28d

Я думаю, вам нужно реализовать что-то вроде алгоритма AllenG с несколькими модификациями

  1. Вам нужно начать с самого раннего datetime (datetime1). Убедитесь, что он самый ранний.
  2. Цикл до datetime1.AddYears (1) сравнивается как больше или равно с вашим последним datetime (datetime2). Убедитесь, что вы сравнили полных datetimes , а не только год свойства starttime и endttime.

    • Увеличение счетчика года на каждой итерации.
    • фактически добавьте год к вашей копии datetime1.
  3. Начните с копии datetime1 (к которой вы добавили годы на шаге 2)

  4. Цикл до datetime1.AddMonths (1) сравнивается как больше или равно вашего последнего значения datetime (datetime2). Опять же: убедитесь, что вы сравниваете полные даты , а не только компонент месяца.
    • Увеличение счетчика месяцев на каждой итерации.
    • фактически добавьте месяц к вашей копии datetime1.
  5. и т.д.. и т.д.

Этот алгоритм гарантирует, что вы вычисляете разницу в годах, месяцах, днях, часах, минутах и ​​секундах, используя правильную выдержку из основного календаря.

0 голосов
/ 08 мая 2011

Эта библиотека включает в себя класс DateDiff с поддержкой года и месяца:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );

  // differences
  Console.WriteLine( "DateDiff.Years: {0}", dateDiff.Years );
  // > DateDiff.Years: 1
  Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
  // > DateDiff.Quarters: 5
  Console.WriteLine( "DateDiff.Months: {0}", dateDiff.Months );
  // > DateDiff.Months: 16
  Console.WriteLine( "DateDiff.Weeks: {0}", dateDiff.Weeks );
  // > DateDiff.Weeks: 70
  Console.WriteLine( "DateDiff.Days: {0}", dateDiff.Days );
  // > DateDiff.Days: 497
  Console.WriteLine( "DateDiff.Weekdays: {0}", dateDiff.Weekdays );
  // > DateDiff.Weekdays: 71
  Console.WriteLine( "DateDiff.Hours: {0}", dateDiff.Hours );
  // > DateDiff.Hours: 11940
  Console.WriteLine( "DateDiff.Minutes: {0}", dateDiff.Minutes );
  // > DateDiff.Minutes: 716441
  Console.WriteLine( "DateDiff.Seconds: {0}", dateDiff.Seconds );
  // > DateDiff.Seconds: 42986489
} // DateDiffSample
0 голосов
/ 08 мая 2011

TimeSpan - правильный способ справиться с этим, однако, если вы не хотите выполнять преобразование месяцев / лет самостоятельно, вы всегда можете использовать какой-то рекурсивный метод для вычитания лет, пока вы не доберетесь до нужного года, месяцев до Вы попадаете в правильный месяц, дни, пока не дойдете до правильного дня и т. д. Однако это будет отстой и будет ужасно.

Кроме того, вам понадобится специальный объект, который будет содержать данные для вас.

Черновая резьба будет что-то вроде

DateTime original = [Whatever]
DateTime compare = [Whatever]
DateTimeDiff difference = GetDifference(original, compare)

GetDifference(DateTime original, DateTime compare)
{
  DateTimeDiff difference = new DateTimeDifference
  while(!original.Equals(compare) && original.Year >= compare.Year)
  {
     original.AddYears(-1);
     difference.Years++;
  }
  <snip...  //more code to do the same thing for months, days, hours, etc.)
}

Как я уже сказал, это было бы ужасно, но вы могли бы сделать это.

0 голосов
/ 08 мая 2011

Я думаю, вам нужно объединить TimeSpan и некоторые пользовательские вычисления.Это потому, что вы хотели бы годы и месяцы, которые имеют переменную длину.Кроме того, вы также хотите количество часов, минут и секунд.Я думаю, что этот подход будет служить вашим потребностям:

var date1 = new DateTime(2010, 1, 1, 8, 0, 15);
var date2 = new DateTime(2007, 8, 18, 13, 30, 30);

var differenceYears = date1.Year - date2.Year;
var tempDate = date2.AddYears(differenceYears);
var differenceMonths = date1.Month - tempDate.Month;
if (differenceMonths < 0)
{
    differenceMonths += 12;
    differenceYears--;
}
tempDate = date2.AddYears(differenceYears).AddMonths(differenceMonths);
var additionalTimeSpan = date1 - tempDate;
var differenceDays = additionalTimeSpan.Days;
var differenceHours = additionalTimeSpan.Hours;
var differenceMinutes = additionalTimeSpan.Minutes;
var differenceSeconds = additionalTimeSpan.Seconds;
0 голосов
/ 07 мая 2011

Вы можете использовать TimeSpan для сравнения двух дат.Посмотрите на

DateTime date1 = new DateTime(2010, 1, 1, 8, 0, 15);
DateTime date2 = new DateTime(2010, 8, 18, 13, 30, 30);
// Calculate the interval between the two dates.
TimeSpan interval = date2 - date1;

Годы и месяцы должны быть рассчитаны с помощью пользовательского кодирования, поскольку месяц - это переменная единица измерения, но, поскольку TimeSpan сообщает вам дни, которые вы можете рассчитать самостоятельно, месяцы и годы.1005 * Посмотрите на этот пост .

Посмотрите на этот форум .

Надеюсь, что эта помощь.

...