Рассмотрите следующие 2 сценария: Сценарий 1). Сегодня 1-го мая 2012, и Сценарий 2). Сегодня 1-го сентября 2012.
Теперь, полагайте, что мы пишем на нашей веб-странице неотступно следование за комментарием, который кто-то оставил: "Этот комментарий был записан 3 месяца и 12 дней назад". Сумма дней в обоих этих сценариях будет ВСЕГДА отличаться даже при том, что оператор является точно тем же. В Сценарии 1, "3 месяца и 12 дней" равнялись бы 102 days
. Однако в Сценарии 2, "3 месяца и 12 дней" были бы 104 days
!
Теперь, для движения на повороте в на моей точке, позволяет, используют другой пример и говорят, что кто-то оставил комментарий к нашему сайту на Jan 30-м 2013 и сегодня 10-го марта 2013. Наш реальный объект TimeSpan должен знать эту относительную дату и может выяснить следующее:
Так, это означало бы 10 дней + 1 день + общее количество 1 месяца, переводя в This comment was posted 1 Month and 11 Days ago
.
Теперь при использовании стиля MS объект TimeSpan (или любой объект TimeSpan на любом языке), он дал бы Вам количество дней от 30-го Jan до 10 марта (39 дней), и потому что объект TimeSpan не хранит относительную дату (основная/начальная дата, которую мы вычли для получения TimeSpan), если Вы спросили это, каким количеством месяцев и дней это было, он предположит, что существует 30 дней за один месяц, или даже хуже, среднее число, которое больше, чем 30 дней, и возвращают остальных в течение многих дней, так для получения до 39 дней, он скажет Вам, что это был 1 Месяц и 9 Дней, и Вы доберетесь This comment was posted 1 Month and 9 Days ago
сообщение. Помните, и эти сценарии имеют ту же дату начала и та же текущая / дата окончания, да объект Microsoft TimeSpan, не позволяя нам сказать этому, что месяц февраля 2013 нужно рассмотреть, дал нам совершенно другой TimeSpan, прочь целыми 2 дни. Это, в действительности, лгало нам.
Проблема, люди будут верить этому, и кто знает, какое восприятие они могут иметь, как их восприятие прошлого может измениться и решения и жизненный выбор, который они могут сделать при попытке восстановить события в прошлом в их собственных умах, в то время как никогда замечающий или понимающий недостаток и свойственный отказ представления времени, которое является настолько распространяющимся везде сегодня. Они не поймут, что языки программирования не понимают (или уход), что прошлый месяц имел 31 день в нем, как отклонено к 30, 29 или 28 - или стих визы, и что это складывает при увеличении TimeSpan.
Это - проблема в основе этого сообщения. Я понимаю, что большинство людей не будет заботиться об этом различии (но будет уверено, что некоторые из нас делают и не могут иметь этого на наших спинах), и если это не беспокоит Вас, это в порядке. Мне жаль, что это не беспокоило меня, я сэкономлю мне некоторое время, напряжение и разочарование. Если это не беспокойство, можно использовать функцию для эффективного текстового дисплея относительного времени (настраиваемый к 1 - 6 узлам от секунд до лет), вместо того, чтобы использовать его для обычно незначительной точности, которую оно обеспечивает.
К моему разочарованию я заметил, что нет никакого реального объекта промежутка, если Вы получаете промежуток и делаете a .years
или .months
Вы ничего не получите, Вы только доберетесь .days
и понизьтесь, потому что объект промежутка не несет ничего для сообщения этого, на каком месяце или годе промежуток был создан. Поэтому это никогда не будет действительно знать, каким количеством месяцев это было, так как дни в каждом месяце варьируются более чем год и еще больше за високосный год.
В ответ на это я отправлю функцию, которую я разработал, чтобы получить Точные показания и смочь возвратить вещи как следование моей веб-страницы ASP.NET...
Отправленный 4 года, 3 месяца, 14 дней, 15 часов, 18 минут и 24 секунды назад
Я полагал, что будет …
timeSpan.GetActualNumberOf[Months/Days/Hours/etc]
(основная дата должна быть обеспечена, конечно),
… метод типа на этом типе данных, но не было.
Все, что необходимо было бы действительно сделать, создают другое свойство на объекте промежутка дать ему основную дату, на которую различие было вычислено, затем вышеупомянутая прекрасная строка будет измерима довольно легко, и a .year
& .month
существовал бы!
ОБНОВЛЕНИЕ: Я значительно подробно остановился и обновил свой официальный ответ и кодирую детали использования в своем ответе ниже, 100%, работающих ответ, и кодирую (полностью), точное и точное относительное время/даты, никакие приближения - спасибо.
Вот основной ответ с кодом. Обратите внимание, что вы можете получить любое количество точных дат / времени, секунд и минут или секунд, минут и дней в любом месте с точностью до лет (что могло бы содержат 6 частей / сегментов). Если вы укажете два первых сегмента и ему больше года, он вернет «1 год и 3 месяца назад» и не вернет остальные, потому что вы запросили два сегмента. если ему всего несколько часов, он вернет только «2 часа и 1 минуту назад». Конечно, те же правила применяются, если вы указываете 1, 2, 3, 4, 5 или 6 сегментов (максимум - 6, потому что секунды, минуты, часы, дни, месяцы, годы составляют только 6 типов). Это также исправит проблемы грамматики, такие как «минуты» против «минут», в зависимости от того, 1 минута или больше, одинаково для всех типов, и «строка» без необходимости модификации. Я знаю, что функция reverseit больше не нужна (существует в .net), но функции ReplaceLast и ReverseIt перенесены из дней pre-.net, поэтому, пожалуйста, извините, как устаревшая она может выглядеть (все еще работает на 100%, хотя использовала em более десяти лет, могу гарантировать, что они не содержат ошибок) ... :). Кроме того, если вы используете VB6, вы можете использовать StrReverse (обертывая его вокруг строки, расширенной с помощью метода расширения .ReverseIt), вместо использования функции ReverseIt () (предоставляемой как метод расширения). Итак, вместо sReplacable.ReverseIt вы должны выполнить StrReverse (sReplacable), поскольку StrReverse () - это встроенная функция VB6 (и делает то же самое, меняет заданную строку на противоположную и больше ничего не делает). Если вы используете StrReverse () вместо моей общей функции ReverseIt, не стесняйтесь удалять функцию / расширение ReverseIt. Функция StrReverse () должна быть доступна в .NET, если вы импортируете устаревшую библиотеку ms-visualbasic-dll. В любом случае, не имеет значения, я написал ReverseIt () еще до того, как узнал, что функция StrReverse () существует, и с тех пор использовал ее по привычке (нет реальной причины использовать мою, в отличие от встроенной универсальной функции StrReverse) - на самом деле, я уверен, что StrReverse (или аналогичная, более новая версия функции реверса строки для .NET) будет написана более эффективно :). ура.
<Extension()> _
Public Function ReplaceLast(ByVal sReplacable As String, ByVal sReplaceWhat As String, ByVal sReplaceWith As String) As String
' let empty string arguments run, incase we dont know if we are sending and empty string or not.
sReplacable = sReplacable.ReverseIt
sReplacable = Replace(sReplacable, sReplaceWhat.ReverseIt, sReplaceWith.ReverseIt, , 1) ' only does first item on reversed version!
Return sReplacable.ReverseIt.ToString
End Function
<Extension()> _
Public Function ReverseIt(ByVal strS As String, Optional ByVal n As Integer = -1) As String
Dim strTempX As String = "", intI As Integer
If n > strS.Length Or n = -1 Then n = strS.Length
For intI = n To 1 Step -1
strTempX = strTempX + Mid(strS, intI, 1)
Next intI
ReverseIt = strTempX + Right(strS, Len(strS) - n)
End Function
I would say that the current TimeSpan is a real timespan object, i.e., the amount of time between Jan 1 2008 1:31 a.m. and Feb. 3, 2008 at 6:45 a.m. is the same as the amount of time between Feb. 5, 2008 at 1:45 p.m. and March 9, 2008 at 6:59 p.m.. What you are looking for is in actuality the difference between two datetimes.
As for the .MakeMagicHappen.gimmeSomethingPretty.surelyMShasThoughtAboutThisDilema to fulfill the specific needs of your system, that's why people hire you as a programmer. If the framework you are using does absolutely everything, your company would just be able to presss a single button and their system would pop out fully formed and you'd be on the unemployment line along with the rest of us programmers.
Here's how to add some extension methods for this with C# using mean values:
public static class TimeSpanExtensions
{
public static int GetYears(this TimeSpan timespan)
{
return (int)(timespan.Days/365.2425);
}
public static int GetMonths(this TimeSpan timespan)
{
return (int)(timespan.Days/30.436875);
}
}
То, что вы ищете, действительно не то, что представляет собой TimeSpan
. TimeSpan
представляет интервал как количество тактов без учета базового DateTime
или календаря
.
Новый тип DateDifference
здесь может быть больше смысла, если конструктор или фабричный метод принимают базу DateTime
, цель DateTime
и, возможно, Calendar
(по умолчанию CultureInfo.CurrentCulture) с помощью которого можно вычислить различные компоненты разницы (годы, месяцы и т. д.)
РЕДАКТИРОВАТЬ: Мне кажется, что Noda Time может иметь необходимые инструменты для этого - Period
class "[r] e представляет период времени, выраженный в человеческих хронологических терминах: часы, дни, недели,
по-прежнему было трудно договориться. Если бы мы все использовали тики из Unix
эпоха, чтобы говорить о времени, не было бы необходимости в такой библиотеке, как
Noda Time.
Но нет, мы любим говорить годами, месяцами, днями, неделями - а для некоторых причина, по которой нам нравится 12 вечера (что сбивает с толку), чтобы быть примерно время, когда солнце находится на пике ... Итак, у нас есть часовые пояса .
Не только это, но мы все не согласны с тем, сколько месяцев там. Разные цивилизации придумали разные способы разделения вверх по году и разные числа для начала года. Эти это календарные системы .