Рассчитать дни в годах и месяцах? - PullRequest
2 голосов
/ 07 октября 2010

Как рассчитать дни в годах и месяцы в c #?для примера:

Если 1. days = 385, тогда мне нужно отобразить Year= 1.1 (т.е. 1 год 1 месяц) 2. days= 234 тогда мне нужно отобразить year =0.7 (то есть 0 год 7 месяцев)

Как мы можем рассчитать в C #?

Я сделал для days=234 /365, и результат - 0,64 (то есть 0 год 6 месяцев).Но на самом деле это 7 месяцев.

Как получить точный год и месяцы.

Ответы [ 9 ]

6 голосов
/ 07 октября 2010

Вы можете сделать:

double temp  = (234.0 /365.0) * 12.0;

int years = (int)temp;
int months = (int)(temp - years);

Это потому, что вы получали 0,64, что составляет 0,64 года.Если вам нужны месяцы, вам нужно умножить это на 12.

В приведенном выше примере вы получите 0 лет и 7 месяцев ... При этом, я не уверен, как именно вы хотитеотформатировать это:

string yearsString = string.Format("{0}.{1}", years, months);

Просто имейте в виду, что это будет 3.11 в течение 11 месяцев, что будет странно, хотя это было ваше требование.

Кроме того, если вы хотитеесли это будет очень общим, вы можете использовать 365,25 вместо 365 для обозначения одного юлианского года , поскольку это поможет вам уменьшить количество проблем, связанных с високосными годами.

2 голосов
/ 07 октября 2010

Если вы не знаете фактических дат, тогда вы можете оценить:

Number of years: x / 365
Number of months: (x % 365) / 30

где% по модулю

1 голос
/ 07 октября 2010

Позвольте сделать некоторые расчеты.

1 mon = 0.1
2 mon = 0.2
.
.
9 mon = 0.9
10 mon = 1.0 [WRONG according to you 1 is a year]
fine then 1 / 12 = 0.083, therefore 0.083 is 1 month

Now, 
234 / 365 = 0.64 => 0.64 / 0.083 => 7.7  i.e. 7th month

Therefore fx => days / 365 = ans  % 0.083 = result.

У меня нет времени доказывать другое число, но вы можете попробовать эту формулу.

1 голос
/ 07 октября 2010

Вы уверены, что хотите этот формат? Результат - по крайней мере, с учетом текущей предоставленной информации - будет нечетким, поскольку месяцы не соответствуют друг другу.

Рассмотрим пару альтернатив:

  • Представление только в течение года, такое как 1,25, означающее "1 и один квартал года". Это не смешивает месяцы и годы, и, таким образом, остается простым, поскольку год - 365 дней (за исключением високосных лет). Это также устраняет двусмысленность, такую ​​как «делает 1.10 == 1.1?»

  • Использование конкретной даты начала, которая позволила бы вам использовать строго типизированные даты. Вы можете легко использовать .ToString() с аргументами форматирования даты, чтобы быстро и точно получить ваш результат.

1 голос
/ 07 октября 2010

Предполагая, что месяц составляет ровно одну двенадцатую года, и что вы хотите игнорировать неполные месяцы (исходя из того, что вы ожидаете 7 из вашего примера с 7,688 месяцами, тогда:

int days = 234;
double years = (double)days / 365.242199;
int wholeYears = (int)Math.Floor(years);
double partYears = years - wholeYears;
double approxMonths = partYears * 12;
string horribleFormat = string.Concat(wholeYears, ".", approxMonths);
0 голосов
/ 07 октября 2010

В VB

    Dim d As DateTime = DateTime.MinValue 'year = 0001
    d = d.AddYears(DateTime.Now.Year - 1) 'add current year
    d = d.AddDays(234) 'add days

    Dim yrs As Integer = d.Year - DateTime.Now.Year 'calculate years
    Dim mos As Double = d.Month / 12 'calculate months
    Dim answer As Double = yrs + mos

answer = .6666666666

0 голосов
/ 07 октября 2010

Псевдокод

ts= TimeSpan.fromDays(385)
Years =  ts.days Modulo 365
months = (ts.days remainder 365) modulo 12
days = (ts.days remainder 365) Remainder 12
answer string years + "." + months + "." + days
0 голосов
/ 07 октября 2010

Я бы предложил использовать DateTime.AddDays: он даст вам все, что вам нужно.Вы также можете добавить другие единицы времени:

    DateTime f = new DateTime(0);
    var y = f.AddDays(361);
0 голосов
/ 07 октября 2010

Я думаю, что это численно невозможно.Что бы вы сделали около 1 года и 11 месяцев?1,11?Потому что это может означать либо 1 год и 1 месяц и что-то, либо 1 год и 11 месяцев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...