Реальный объект промежутка с.Years и.Months

Рассмотрите следующие 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 день в Jan (рассчитывающий от 30-го до 31-го).
  • То, что февраль месяца является одним месяцем независимо от сколько дней, там находятся в нем (даже при том, что это - 28 дней).

Так, это означало бы 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%, работающих ответ, и кодирую (полностью), точное и точное относительное время/даты, никакие приближения - спасибо.

24
задан 20 revs, 5 users 69% 23 September 2015 в 20:48
поделиться

4 ответа

Вот основной ответ с кодом. Обратите внимание, что вы можете получить любое количество точных дат / времени, секунд и минут или секунд, минут и дней в любом месте с точностью до лет (что могло бы содержат 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 
5
ответ дан 28 November 2019 в 23:12
поделиться

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.

2
ответ дан 28 November 2019 в 23:12
поделиться

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);
    }
}
25
ответ дан 28 November 2019 в 23:12
поделиться

То, что вы ищете, действительно не то, что представляет собой TimeSpan . TimeSpan представляет интервал как количество тактов без учета базового DateTime или календаря .

Новый тип DateDifference здесь может быть больше смысла, если конструктор или фабричный метод принимают базу DateTime , цель DateTime и, возможно, Calendar (по умолчанию CultureInfo.CurrentCulture) с помощью которого можно вычислить различные компоненты разницы (годы, месяцы и т. д.)

РЕДАКТИРОВАТЬ: Мне кажется, что Noda Time может иметь необходимые инструменты для этого - Period class "[r] e представляет период времени, выраженный в человеческих хронологических терминах: часы, дни, недели, по-прежнему было трудно договориться. Если бы мы все использовали тики из Unix эпоха, чтобы говорить о времени, не было бы необходимости в такой библиотеке, как Noda Time.

Но нет, мы любим говорить годами, месяцами, днями, неделями - а для некоторых причина, по которой нам нравится 12 вечера (что сбивает с толку), чтобы быть примерно время, когда солнце находится на пике ... Итак, у нас есть часовые пояса .

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

11
ответ дан 28 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: