Вот пример явного кодирования, который я получил для работы:
[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();
}
Пожалуйста, дайте мне знать, если есть лучший способ сделать это ...
Этот вопрос должен помочь вам начать работу. У него есть код, который этот сайт использует для расчета своего относительного времени. Он может не иметь определенных диапазонов, которые вы хотите, но их достаточно легко добавить, как только вы его настроите.
У моей компании есть эта библиотека .NET , которая делает кое-что из того, что вы хотите, потому что она очень гибко разбирает дату и время (включая некоторые относительные форматы), но только -относительные выходы.
Вы можете найти источник из времени полезным. Описание плагина - это «плагин jQuery, который позволяет легко поддерживать автоматическое обновление нечетких временных отметок (например,« 4 минуты назад »или« около 1 дня назад »).»
По сути, это порт JavaScript в Rails Функция distance_of_time_in_words
встроена в плагин jQuery.
Это почти всегда делается с помощью гигантского оператора switch и является тривиальным для реализации.
Помните следующее:
Я знаю, что выражение таких времен стало довольно популярным в последнее время, но, пожалуйста, подумайте над тем, чтобы сделать возможным переключение между относительными «нечеткими» и обычными абсолютными датами.
Например, это полезно знать, что комментарий был сделан 5 минут назад, но менее полезно говорить мне, что комментарий A был 4 часа назад, а комментарий B был 9 часов назад, когда сейчас 11 часов утра, и я бы лучше знал, что комментарий A был написан, когда кто-то проснулся этим утром и комментарий B был написан кем-то, кто ложился спать поздно (предполагая, что я знаю, что они в моем часовом поясе).
- РЕДАКТИРОВАТЬ: глядя на ваш вопрос, вы, кажется, избежали этого в некоторой степени, ссылаясь на время суток вместо «X назад», но с другой стороны, вы можете создавать ложное впечатление, если пользователи находятся в другом часовом поясе, так как ваше «это утро» может быть среди ночи для соответствующего пользователя.
Было бы здорово дополнить время относительным временем дня в зависимости от часового пояса другого пользователя, но это предполагает, что пользователи готовы поставь это и это правильно.
Я не уверен, почему вы говорите, что это будет ужасная практика кодирования. Каждая из возвращаемых строк на самом деле является подмножеством родительского набора, поэтому вы можете сделать это элегантно в цепочке 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"
Возможно, вы захотите взглянуть на функцию 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
По моему опыту, эти типы генераторов дат вовсе не «нечеткие». На самом деле, они просто куча временных групп, основанных на утверждениях. Например, любое время меньше 30 секунд - это «моменты назад», 360–390 дней - «всего год назад» и т. Д. Некоторые из них будут использовать целевую дату для расчета специальных имен (июнь, среда и т. Д.). Извините, что разбил ваши иллюзии.
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/
В 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;
}
Примечания:
Вы можете установить свойство «doesRelativeDateFormatting» в Interface Builder: