Конвертировать Дни в Год, Месяц, День, формат даты и времени - PullRequest
3 голосов
/ 20 февраля 2012

Я изучал функции и процедуру TDateTime, но не нашел чего-то, что позволило бы мне конвертировать количество дней в эквивалентный год, месяц, день, например, если у меня дни = 0, я должен иметь в результате:

Year:   0
Month:  0
Day:    0

или у меня есть дни = 1, должно иметь:

Year:   0
Month:  0
Day:    1   // Just 1 day 

или, если у меня есть дни = 32:

Year:   0
Month:  1  // January is 31 days
Day:    1  // Day is 1 
           // Total are 32 days 

и т. Д., Учитывая также, когда февраль месяц29 дней, и не только 28. В delphi xe2, кто может сказать мне, что функция делает это, или если нужно написать это вручную?Большое спасибо.

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Используя методы DateUtils:

procedure daysToDate(days: Integer; out day, month, year: Integer);
var
  january1st: TDateTime;
  targetDate: TDateTime;
begin
  january1st := StartOfTheYear(Now());
  targetDate := IncDay(january1st, days);

  day := DayOfTheMonth(targetDate) - 1;
  month := MonthOfTheYear(targetDate) - 1;
  year := YearOf(targetDate) - YearOf(january1st);
end;

Этот код предполагает, что вы считаете дни в текущем году.Если вы хотите начать в другом году, измените строку january1st := StartOfTheYear(Now()); по мере необходимости.

3 голосов
/ 20 февраля 2012

Я не очень понимаю ваш вопрос.

Если вы хотите перевести количество дней (в некоторых временных интервалах):

Нет ничего подобного, по той простой причине, что это не будет четко определено, по той причине, которую вы даете: не каждый месяц имеет одинаковое количество дней. Следовательно, ввод не может быть только числом дней. Например, каким должен быть результат, если вы введете «35 дней»? Должно ли это быть «1 месяц, 4 дня» или «1 месяц, 5 дней», «1 месяц, 6 дней» или «1 месяц, 7 дней»? Вместо этого вам нужно указать начальную и конечную даты.

Теперь, в DateUtils, у вас есть DaysBetween, MonthsBetween и YearsBetween, но эти являются только приблизительными.

Если вы можете жить с приблизительными значениями, это легко, хотя: количество лет равно целой части числа дней, деленного на 365,24, количество месяцев равно дробной части, умноженной на 12, и т. Д.

Если вы хотите получить N-й день какого-либо года:

IncDay(StartOfTheYear(SomeYear), N)
...