2015-06-03 8 views
0

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

Пример: Опыт работника рассчитывается согласно его дате join(DOJ) и дате Relieve(DOR). У нас есть DOJ, DOR and Number дней, когда он работает в качестве сотрудника.

Необходимо рассчитать, сколько лет и месяцев и дней.

Example  : DOJ = 14 Feb 2000 
       DOR = 08 aug 2013 
Output  : 13 Years - 5 Months - 25 Days 

Заранее спасибо ....

+0

'DOJ' и' DOR' являются ' DateTime'? –

+0

Я видел конверсию года или года, их легче реализовать. Я думаю, что за год-месяц-день, пробуйте играть со временем. Я думаю: p –

+0

@RyanChu Я уже пробовал ... не полезно .. Спасибо за ваш интерес ... – Sankar

ответ

2

Это работает для меня:

var dor = new DateTime(2013, 08, 08); 
var doj = new DateTime(2000, 02, 14); 

var totalmonths = (dor.Year - doj.Year) * 12 + dor.Month - doj.Month; 
totalmonths += dor.Day < doj.Day ? -1 : 0; 

var years = totalmonths/12; 
var months = totalmonths % 12; 
var days = dor.Subtract(doj.AddMonths(totalmonths)).Days; 
+0

@PanagiotisKanavos - Да, это так. 'f = new DateTime (2004, 2, 14), t = новый DateTime (2004, 3, 13)' => 28 дней. 'f = новый DateTime (2005, 2, 14), t = новый DateTime (2005, 3, 13)' => 27 дней. – Enigmativity

+0

Извините, на самом деле я задаюсь вопросом, все ли это эквивалентно [this] (http://stackoverflow.com/a/9216404/134204) ответам, которые подсчитывают годы и т. Д. От начала до конца, только намного короче. –

+0

@PanagiotisKanavos - В коде, который вы также связали, есть ошибка. Попробуйте запустить этот код с датами 2020-02-29 по 2021-06-29 - он возвращает «1y 4m 1d», когда он должен быть «1y 4m 0d» (который возвращает мой код). Ошибка в этом коде, по-видимому, связана с пониманием того, как '.AddMonths (1)' работает, когда применяется к «2015-01-30» - он возвращает «2015-02-28». Таким образом, расчет заканчивается на несколько дней. – Enigmativity

1

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

Однако у вас уже есть две даты для работы с так что вы можете вычислить это значение, как так:

Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click 

    Dim doj As Date = New Date(2000, 2, 14) 
    Dim dor As Date = New Date(2013, 8, 8) 

    MessageBox.Show(GetDateSpanText(doj, dor)) 

End Sub 

Public Shared Function GetDateSpanText(fromDate As DateTime, Optional toDate As DateTime = Nothing) As String 
    Try 
     Dim years As Integer = 0, months As Integer = 0, days As Integer = 0 
     If toDate = Nothing Then toDate = DateTime.Now 

     Do Until toDate.AddYears(-1) < fromDate 
      years += 1 
      toDate = toDate.AddYears(-1) 
     Loop 

     Do Until toDate.AddMonths(-1) < fromDate 
      months += 1 
      toDate = toDate.AddMonths(-1) 
     Loop 

     Do Until toDate.AddDays(-1) < fromDate 
      days += 1 
      toDate = toDate.AddDays(-1) 
     Loop 

     Return String.Format("{0} Years {1} Months {2} Days", years, months, days) 
    Catch ex As Exception 
     Return "Error" 
    End Try 
End Function 
+0

Собственно, вы можете запросить класс [System.Globalization.Calendar] (https://msdn.microsoft.com/en-us/library/system.globalization.calendar%28v=vs.110%29.aspx). Вам не нужно, хотя, поскольку вы * можете * вычислить разницу между частями года и месяца. Остальные, дни, можно рассчитать как TimeSpan. Это показано в этом [ответе] (http://stackoverflow.com/a/9216404/134204) –

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