2015-04-22 2 views
-2

Да, я знаю, что есть много подобных вопросов, но я не нашел никакого решения.Как конвертировать число дней в несколько лет, месяцев, дней?

Проблема заключается в том, чтобы получить годы, месяцы, дни от дней.

Главная проблема заключается в:

1 месяц = ​​30 дней
1 год = 365 дней

Например:

30 days = 0 year, 1 month, 0 days 
364 days = 0 year, 11 months, 29 days 

И у меня есть проблема. Как я могу это сделать? Вот мой код:

int totalDays = 364; 
int daysInMonth = 30; //30.41666666666667 
int onlyYears = Math.floor(totalDays/365).intValue(); 
int onlyMonths = Math.floor((totalDays - (onlyYears*365))/daysInMonth).intValue(); 
int onlyDays = totalDays - onlyMonths*daysInMonth - onlyYears*365; 
println(onlyYears + ":" + onlyMonths + ":" + onlyDays); 

Таким образом, если DAYSINMONTH = 30 он работает правильно для totalDays 30 = 1 месяц, 40 = 1 месяц и 10 дней и т.д., но если я установить totalDays в 364 код возвращает 12 месяцев и 4 дней, но 11 месяцев и 29 дней. Если я установил daysInMonth на 30.41666666666667, он будет работать в течение 364, но неправильно для 30, 40 и т. Д.

+0

Какая версия Java/Groovy вы используете? –

+0

Ну, это будет зависеть от того, какой день и месяц (и год для летних лет) вы находитесь. 30 дней, начинающихся с 1 января, и 30 дней, начинающихся 1 февраля, должны давать разные результаты. Или я не понимаю, чего вы пытаетесь достичь? – amit

+0

Java 7, Groovy 2.4.3 – Gwalk

ответ

0

Вы не можете сделать это только за одну переменную месяца. Мой совет;

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

2

Если вы используете Java 8 с Groovy, вы могли бы сделать:

import java.time.* 

int totalDays = 364 

Period diff = LocalDate.now().with { now -> 
    Period.between(now, now.plusDays(totalDays)) 
} 

println "$diff.years years, $diff.months months and $diff.days days" 

0 years, 11 months and 29 days Для печати.

Если вы используете Java 7 с Groovy, вы могли бы использовать JodaTime in a very similar way

@Grab('joda-time:joda-time:2.7') 
import org.joda.time.* 

int totalDays = 364 

Period diff = LocalDate.now().with { now -> 
    new Period(now, now.plusDays(totalDays), PeriodType.yearMonthDay()) 
} 

println "$diff.years years, $diff.months months and $diff.days days" 
+0

365 дает 11 месяцев и 30 дней, и мне нужен 1 год :) – Gwalk

+0

@Gwalk, но февраль следующего года - високосный год, так что 29 дней. (т. е. один год с сегодняшнего дня - 366 дней, а не 365) –

+0

Да, я понимаю, но в статистике нет ничего подобного. Каждый месяц имеет 30 дней, каждый год имеет 365 дней. – Gwalk

0

месяцев 28, 29, 30 или 31 дней. Итак, , если у вас нет startDate, чтобы проверить даты между днями, что вам нужно сделать, это создать правило, чтобы избежать ошибок в месяцах.

Один простой способ я могу найти просуммировать + 1 в каждый четный месяц (за исключением декабря, что это остающегося) как:

MONTH 1 2 3 4 5 6 7 8 9 10 11 
DAYS 30 31 30 31 30 31 30 31 30 31 30 = 335 + x days left.. 

Это будет исправить ваш расчет, но вы будете сталкиваться с проблемой. Этот номер, так как у вас нет начальной или конечной даты, не будет реальным, 31 день может быть всего 1 месяц (декабрь) или 1 месяц (февраль) + 3 дня (с марта или января).

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