Нечеткий алгоритм даты

Вот пример явного кодирования, который я получил для работы:

  [HttpGet]
    public IEnumerable<TestInfo> GetTestInfo()
    {

       List<TestInfo> tstinfoIn = _context.TestInfo.ToList();
       List<TestTypeInfo> tsttypinfoIn = _context.TestTypeInfo.ToList();
       List<TestInfo> tstinfoComboOut = new List<TestInfo>();

       tstinfoComboOut = tstinfoIn
                       .Select(c => new TestInfo()
                       {
                           TestId = c.TestId,
                           TestShortDescription = c.TestShortDescription,
                           TestLongDescription = c.TestLongDescription,
                           TestTypeId = c.TestTypeId,
                           TestLimitsId = c.TestLimitsId,
                           TestTypeInfos = GetTestTypeInfo(tsttypinfoIn, c.TestTypeId)
                       })
                       .ToList();

        return tstinfoComboOut; 
    }

Вот метод GetTestTypeInfo для извлечения потомков:

 public static List<TestTypeInfo> GetTestTypeInfo(List<TestTypeInfo> tsttypinfoIn, int parentTestTypeId)
    {
        return tsttypinfoIn
                .Where(c => c.TestTypeId == parentTestTypeId)
                .Select(c => new TestTypeInfo
                {
                    TestTypeId = c.TestTypeId,
                    TestTypeShortDescription= c.TestTypeShortDescription,
                    TestTypeLongDescription = c.TestTypeLongDescription
                })
                .ToList();
    }

Пожалуйста, дайте мне знать, если есть лучший способ сделать это ...

32
задан neolaser 21 January 2011 в 03:13
поделиться

10 ответов

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

9
ответ дан 27 November 2019 в 20:58
поделиться

У моей компании есть эта библиотека .NET , которая делает кое-что из того, что вы хотите, потому что она очень гибко разбирает дату и время (включая некоторые относительные форматы), но только -относительные выходы.

0
ответ дан 27 November 2019 в 20:58
поделиться

Вы можете найти источник из времени полезным. Описание плагина - это «плагин jQuery, который позволяет легко поддерживать автоматическое обновление нечетких временных отметок (например,« 4 минуты назад »или« около 1 дня назад »).»

По сути, это порт JavaScript в Rails Функция distance_of_time_in_words встроена в плагин jQuery.

0
ответ дан 27 November 2019 в 20:58
поделиться

Это почти всегда делается с помощью гигантского оператора switch и является тривиальным для реализации.

Помните следующее:

  • Всегда сначала проверяйте наименьший промежуток времени
  • Don не забывайте сохранять ваши строки локализуемыми.
0
ответ дан 27 November 2019 в 20:58
поделиться

Я знаю, что выражение таких времен стало довольно популярным в последнее время, но, пожалуйста, подумайте над тем, чтобы сделать возможным переключение между относительными «нечеткими» и обычными абсолютными датами.

Например, это полезно знать, что комментарий был сделан 5 минут назад, но менее полезно говорить мне, что комментарий A был 4 часа назад, а комментарий B был 9 часов назад, когда сейчас 11 часов утра, и я бы лучше знал, что комментарий A был написан, когда кто-то проснулся этим утром и комментарий B был написан кем-то, кто ложился спать поздно (предполагая, что я знаю, что они в моем часовом поясе).

- РЕДАКТИРОВАТЬ: глядя на ваш вопрос, вы, кажется, избежали этого в некоторой степени, ссылаясь на время суток вместо «X назад», но с другой стороны, вы можете создавать ложное впечатление, если пользователи находятся в другом часовом поясе, так как ваше «это утро» может быть среди ночи для соответствующего пользователя.

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

1
ответ дан 27 November 2019 в 20:58
поделиться

Я не уверен, почему вы говорите, что это будет ужасная практика кодирования. Каждая из возвращаемых строк на самом деле является подмножеством родительского набора, поэтому вы можете сделать это элегантно в цепочке if / elseif.

if timestamp < 5sec
    "A moment ago"
elseif timestamp < 5min 
    "Few minutes ago"
elseif timestamp < 12hr && timestamp < noon
    "Today Morning"
...
elseif timestamp < 1week 
    "Few days ago"
elseif timestamp < 1month
    "Few weeks ago"
elseif timestamp < 6month
    "Few Months ago" 
...
else
    "Really really long time ago"
3
ответ дан 27 November 2019 в 20:58
поделиться

Возможно, вы захотите взглянуть на функцию Rail distance_of_time_in_words в date_helper.rb , которую я вставил ниже.

# File vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb, line 59
def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
 from_time = from_time.to_time if from_time.respond_to?(:to_time)
 to_time = to_time.to_time if to_time.respond_to?(:to_time)
 distance_in_minutes = (((to_time - from_time).abs)/60).round
 distance_in_seconds = ((to_time - from_time).abs).round

 I18n.with_options :locale => options[:locale], :scope => 'datetime.distance_in_words''datetime.distance_in_words' do |locale|
   case distance_in_minutes
     when 0..1
       return distance_in_minutes == 0 ?
              locale.t(:less_than_x_minutes, :count => 1) :
              locale.t(:x_minutes, :count => distance_in_minutes) unless include_seconds

       case distance_in_seconds
         when 0..4   then locale.t :less_than_x_seconds, :count => 5
         when 5..9   then locale.t :less_than_x_seconds, :count => 10
         when 10..19 then locale.t :less_than_x_seconds, :count => 20
         when 20..39 then locale.t :half_a_minute
         when 40..59 then locale.t :less_than_x_minutes, :count => 1
         else             locale.t :x_minutes,           :count => 1
       end

     when 2..44           then locale.t :x_minutes,      :count => distance_in_minutes
     when 45..89          then locale.t :about_x_hours,  :count => 1
     when 90..1439        then locale.t :about_x_hours,  :count => (distance_in_minutes.to_f / 60.0).round
     when 1440..2879      then locale.t :x_days,         :count => 1
     when 2880..43199     then locale.t :x_days,         :count => (distance_in_minutes / 1440).round
     when 43200..86399    then locale.t :about_x_months, :count => 1
     when 86400..525599   then locale.t :x_months,       :count => (distance_in_minutes / 43200).round
     when 525600..1051199 then locale.t :about_x_years,  :count => 1
     else                      locale.t :over_x_years,   :count => (distance_in_minutes / 525600).round
   end
 end
end
7
ответ дан 27 November 2019 в 20:58
поделиться

По моему опыту, эти типы генераторов дат вовсе не «нечеткие». На самом деле, они просто куча временных групп, основанных на утверждениях. Например, любое время меньше 30 секунд - это «моменты назад», 360–390 дней - «всего год назад» и т. Д. Некоторые из них будут использовать целевую дату для расчета специальных имен (июнь, среда и т. Д.). Извините, что разбил ваши иллюзии.

1
ответ дан 27 November 2019 в 20:58
поделиться

needless to say (but i'll say it anyway) don't use a where loop that decrements 365 days per year even on 366 day leap years (or you'll find yourself in the ranks of the Zune developers)

here is a c# version:

http://tiredblogger.wordpress.com/2008/08/21/creating-twitter-esque-relative-dates-in-c/

1
ответ дан 27 November 2019 в 20:58
поделиться

В NSDateFormatter есть свойство - «doesRelativeDateFormatting». Он появляется только в 10.6 / iOS4.0 и более поздних версиях, но форматирует дату в относительную дату в правильном языковом стандарте.

Из Документация Apple :

Если средство форматирования даты использует относительную дату форматирование, по возможности заменяет компонент даты его вывода с фраза - например, «сегодня» или «Завтра» - указывает на родственника Дата. Доступные фразы зависят от языковой стандарт для средства форматирования даты; тогда как для свиданий в будущем Английский может допускать только «завтра» Французский может разрешить «на следующий день после послезавтра », как показано на следующий пример.

Код

Ниже приведен код, который распечатает достаточное количество относительных строк для данной локали.

NSLocale *locale = [NSLocale currentLocale];
//    NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

NSDateFormatter *relativeDateFormatter = [[NSDateFormatter alloc] init];
[relativeDateFormatter setTimeStyle:NSDateFormatterNoStyle];
[relativeDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[relativeDateFormatter setDoesRelativeDateFormatting:YES];
[relativeDateFormatter setLocale:locale];

NSDateFormatter *normalDateFormatter = [[NSDateFormatter alloc] init];
[normalDateFormatter setTimeStyle:NSDateFormatterNoStyle];
[normalDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[normalDateFormatter setDoesRelativeDateFormatting:NO];
[normalDateFormatter setLocale:locale];

NSString * lastUniqueString = nil;

for ( NSTimeInterval timeInterval = -60*60*24*400; timeInterval < 60*60*24*400; timeInterval += 60.0*60.0*24.0 )
{
    NSDate * date = [NSDate dateWithTimeIntervalSinceNow:timeInterval];

    NSString * relativeFormattedString = [relativeDateFormatter stringForObjectValue:date];
    NSString * formattedString = [normalDateFormatter stringForObjectValue:date];

    if ( [relativeFormattedString isEqualToString:lastUniqueString] || [relativeFormattedString isEqualToString:formattedString] )
        continue;

    NSLog( @"%@", relativeFormattedString );
    lastUniqueString = relativeFormattedString;
}

Примечания:

  • Локаль не требуется
  • Есть не так много замен для Английский. На момент написания там являются: «Вчера, сегодня, завтра». Apple может добавить больше в будущем.
  • Приятно сменить язык и посмотреть что доступно на других языках (Во французском немного больше, чем в английском, например)
  • Если в iOS вы можете подписаться на UIApplicationSignificantTimeChangeNotification

Interface Builder

Вы можете установить свойство «doesRelativeDateFormatting» в Interface Builder:

  • Выберите NSDateFormatter и выберите вкладку «Инспектор идентичности» палитры инспектора (последний один [команда-6]).
  • В подразделе "Пользователь" Определенные атрибуты времени выполнения ", вы можете добавьте собственное значение для ключа выбранного объекта (в данном случае вашего экземпляра NSDateFormatter). Добавлять "doesRelativeDateFormatting" выберите "логический" тип, и убедитесь, что он проверил.
  • Помните : может показаться, что это вообще не сработало, но это могло быть потому, что для вашего языкового стандарта есть только несколько заменяемых значений. Попробуйте хотя бы дату вчера, сегодня и завтра, прежде чем вы решите, правильно ли она настроена.
12
ответ дан 27 November 2019 в 20:58
поделиться
Другие вопросы по тегам:

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