Рассмотрим следующие два сценария: Сценарий 1). Сегодня 1 мая 2012 года и Сценарий 2). Сегодня 1 сентября 2012 года.
Теперь подумайте, что мы пишем на нашей веб-странице следующее о комментарии, который кто-то оставил: "Этот комментарий был написан 3 месяца и 12 дней назад". Количество дней в обоих этих сценариях ВСЕГДА будет отличаться, хотя утверждение будет точно таким же. В Сценарии 1 "3 месяца и 12 дней" будут равны 102 days
. Однако в Сценарии 2 "3 месяца и 12 дней" будут 104 days
!
Теперь, чтобы углубиться в мою точку зрения, давайте использовать другой пример и скажем, что кто-то оставил комментарий на нашем сайте 30 января 2013 года, а сегодня - 10 марта 2013 года. Наш реальный объект TimeSpan должен знать эту относительную дату, и может выяснить следующее:
- В марте 10 дней,
- Что есть 1 день в январе (с 30 по 31).
- То, что месяц Фев - один месяц, независимо от того, сколько дней в нем (хотя это 28 дней).
Итак, это означало бы 10 дней + 1 день + 1 месяц, переведя на This comment was posted 1 Month and 11 Days ago
.
Теперь, если вы использовали объект TimeSpan в стиле MS (или любой объект TimeSpan на любом языке), он дал бы вам количество дней с 30 января по 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 узлов от секунд до нескольких лет), вместо того чтобы использовать его для обычно незначительной точности, которую он предоставляет.
К моему разочарованию я заметил, что нет реального объекта timepan, если вы получаете промежуток времени, и делаете .years
или .months
, вы ничего не получите, вы получите только .days
и ниже, потому что Объект timeSpan не несет ничего, чтобы сообщить ему, в каком месяце или году был создан timeSpan. Поэтому он никогда не узнает, сколько месяцев прошло с тех пор, как дни в каждом месяце меняются в течение года и даже в течение високосного года.
В ответ на это, я опубликую функцию, которую я разработал, чтобы получить ТОЧНЫЕ показания и иметь возможность возвращать на моей веб-странице ASP.NET такие вещи, как следующее:
Отправлено 4 года, 3 месяца, 14 дней, 15 часов, 18 минут и 24 секунд назад
Я понял, что будет & hellip;
timeSpan.GetActualNumberOf[Months/Days/Hours/etc]
(базовая дата должна быть предоставлена, конечно)
& hellip; типа в этом типе данных, но не было.
Все, что вам действительно нужно сделать, это создать еще одно свойство объекта timeSpan, чтобы дать ему базовую дату, на которой была рассчитана разница, тогда эта прекрасная строка будет легко вычисляться, а .year
и .month
будет существовать!
ОБНОВЛЕНИЕ: я значительно расширил и обновил свои официальные ответы и данные об использовании кода в моем ответе ниже, 100% рабочий ответ и код (в полном объеме), точное и точное относительное время/даты, без приближений - спасибо.