2012-02-20 9 views
3

Я изучаю функции и процедуру 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, кто может сказать мне, какую функцию это сделать, или, если нужно, написать его вручную? Огромное спасибо.

+0

Вы должны задать свой вопрос о тегах на http://meta.stackoverflow.com –

+0

Есть несколько возможных вариантов вашего вопроса. –

+0

Спасибо, решил про фильтр :) –

ответ

6

Используя методы в 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());.

+0

Спасибо, он решает мою проблему. Огромное спасибо. –

+2

@ Марчелло: Если да, то предполагаемая интерпретация вашего вопроса отличается от самой естественной. –

+0

Нет, он решил о счетчике. В реале мне захотелось преобразовать целое число (представляющее милисекунды) в эквивалентный формат времени, который меня заставляет: годы, месяцы, дни, часы, минуты, секунды и милисекунды. Я пробовал с кодированием, и он хорошо работает часами, минутами, секундами и miliseconds, но с encodedate не работает. Например, за один день есть 86400000 миллисекунд, тогда я был уверен, что encodedate превратит меня в 1 день, но он изменит неправильные значения. –

3

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

Если вы хотите перевести несколько дней (в некоторых TimeSpan):

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

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

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

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

IncDay(StartOfTheYear(SomeYear), N) 
+0

Привет, это правда, я предположил, что начальная дата была 0 (год = 0, месяц 0, день = 0). Datetime - это реальная ценность, я видел, что параметр datetime, например, для 0.99999999, мне приходится 23 часа, 59 минут, 59 секунд и 999 миллисекунд; поэтому я подумал, что установка его 1.0000000 равнялась 1 дням, 0 месяцам, 0 годам, но мне возвращаются 1899 лет, 12 месяцев и 30 дней, что, конечно, неправильно (для моего случая). Тоже, если я понял, что это для delphi, означает, что первая дата доступна. –

+1

@Marcello: Вам стоит подумать о том, чтобы прочитать статью справки для ['TDateTime'] (http://docwiki.embarcadero.com/VCL/en/System.TDateTime) ;-) – Chris

+0

Да @Chris, infact я понял, потому что результат был он, читая там. –

Смежные вопросы